2009-12-03 6 views
7

J'ai une application console en C#. Si quelque chose ne va pas, j'appelle le Environment.Exit() pour fermer mon application. Je dois me déconnecter du serveur et fermer certains fichiers avant la fin de l'application.Comment appeler l'événement avant Environment.Exit()?

En Java, je peux implémenter un hook d'arrêt et l'enregistrer via Runtime.getRuntime().addShutdownHook(). Comment puis-je obtenir la même chose en C#?

Répondre

18

Vous pouvez joindre un gestionnaire d'événements à l'événement ProcessExit de domaine d'application actuel:

using System; 
class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.ProcessExit += (s, e) => Console.WriteLine("Process exiting"); 
     Environment.Exit(0); 
    } 
} 
+1

Je n'aime pas lambda :). Mais merci, mal essayer. – Makah

-2

Je vous recommande d'encapsuler l'appel à Environment.Exit() dans votre propre méthode et de l'utiliser tout au long. Quelque chose comme ceci:

internal static void MyExit(int exitCode){ 
    // disconnect from network streams 
    // ensure file connections are disposed 
    // etc. 
    Environment.Exit(exitCode); 
} 
+0

n'existe pas en C# une sortie un événement? – Makah

+1

-1: Ceci augmente considérablement le Couplage quand il y a d'autres moyens * faciles * de faire fonctionner les choses sans cela: http://en.wikipedia.org/wiki/Coupling_(computer_science) –

+0

Comment augmenterait-il le couplage? La question est de savoir comment résoudre ce problème au sein d'une application de la console. L'appel à Environment.Exit est donc une action valide. Accordé en utilisant les événements serait plus facile, mais ils vont contre l'AppDomain, pas le processus. –

9

Crochet AppDomain événements:

private static void Main(string[] args) 
{ 
    var domain = AppDomain.CurrentDomain; 
    domain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
    domain.ProcessExit += new EventHandler(domain_ProcessExit); 
    domain.DomainUnload += new EventHandler(domain_DomainUnload); 
} 
static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
{ 
    Exception e = (Exception)args.ExceptionObject; 
    Console.WriteLine("MyHandler caught: " + e.Message); 
} 

static void domain_ProcessExit(object sender, EventArgs e) 
{ 
} 
static void domain_DomainUnload(object sender, EventArgs e) 
{ 
} 
Questions connexes