2009-12-03 16 views
7

Tengo una aplicación de consola en C#. Si algo sale mal, llamo al Environment.Exit() para cerrar mi aplicación. Necesito desconectarme del servidor y cerrar algunos archivos antes de que termine la aplicación.Cómo llamar evento antes de Environment.Exit()?

En Java, puedo implementar un gancho de apagado y registrarlo a través de Runtime.getRuntime().addShutdownHook(). ¿Cómo puedo lograr lo mismo en C#?

Respuesta

18

Puede asociar un controlador de un evento a otro ProcessExit del dominio de aplicación actual:

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

No me gusta lambda :). Pero gracias, lo intentaré. – Makah

-2

Recomiendo encapsular la llamada a Environment.Exit() en su propio método y usarlo en todo momento. Algo como esto:

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

no existe en C# una salida ¿evento? – Makah

+1

-1: Esto aumenta significativamente el acoplamiento cuando hay otras formas * fáciles * de hacer que las cosas funcionen sin esto: http://en.wikipedia.org/wiki/Coupling_(computer_science) –

+0

¿cómo aumentaría el acoplamiento? La pregunta es cómo abordar esto en una aplicación de consola, por lo que llamar a Environment.Exit sería una acción válida. El uso de los eventos sería más fácil, pero van en contra del dominio de la aplicación, no del proceso. –

9

gancho AppDomain eventos:

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