2009-12-03 2 views
7

Ho un'applicazione console in C#. Se qualcosa va storto, chiamo Environment.Exit() per chiudere la mia domanda. Devo disconnettermi dal server e chiudere alcuni file prima che l'applicazione finisca.Come chiamare un evento prima di Environment.Exit()?

In Java, posso implementare un hook di shutdown e registrarlo tramite Runtime.getRuntime().addShutdownHook(). Come posso ottenere lo stesso risultato in C#?

risposta

18

È possibile collegare un gestore di eventi per eventi ProcessExit del dominio applicazione corrente:

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

Non mi piace lambda :). Ma grazie, prova male. – Makah

-2

Si consiglia di avvolgere la chiamata in Environment.Exit() nel proprio metodo e utilizzare tutto questo. Qualcosa di simile a questo:

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

non esiste in C# un'uscita evento? – Makah

+1

-1: Questo aumenta significativamente l'accoppiamento quando ci sono altri * semplici * modi per far funzionare le cose senza questo: http://en.wikipedia.org/wiki/Coupling_(computer_science) –

+0

come aumenterebbe l'accoppiamento? La domanda è chiedere come affrontare questo all'interno di un'applicazione Console, quindi chiamare Environment.Exit sarebbe un'azione valida. Concedere l'utilizzo degli eventi sarebbe più semplice, ma vanno contro l'AppDomain, non il processo. –

9

Hook AppDomain eventi:

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) 
{ 
}