¿El trabajo evento Application.ApplicationExit a ser notificado de salida en aplicaciones que no son Winforms?
-
22-08-2019 - |
Pregunta
Nuestra biblioteca de código debe ser notificado cuando la aplicación está saliendo. Así que hemos suscrito al evento System.Window.Forms.Application.ApplicationExit. Esto funciona muy bien para aplicaciones Winforms, pero también funciona para otros tipos de aplicaciones, tales como aplicaciones de consola, servicios y aplicaciones web (como ASP.NET)? El espacio de nombres sugiere que no es así, y es de suponer que se genera cuando se llama Application.Exit()
(explícita o implícitamente), que puede no ser correcto llamar a estos otros casos.
¿Hay algún otro evento que sería mejor en estos otros casos, o lo que sería más universal (ideal si funciona para Windows Forms, también)? Por ejemplo, ¿hay un evento para cuando Environment.Exit()
se llama (aplicación de consola)?
He encontrado una mención de un evento de salidos en System.Diagnostic.Process, pero esto parece ser para el control de la salida de otro proceso, y no parece ser recibidas por un proceso de sobre en sí (por ejemplo, Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;
). Me gustaría pensar que sólo podría ser elevado después del proceso realmente ha salido, por lo que no iba a funcionar.
Esto es particularmente para .NET 2.0 y C #.
Solución
Finalmente encontramos más sobre esto (pero para entonces mi máquina había sido reconstruido y perdimos las galletas a mi perfil no registrada aquí, es de esperar, puesto que le permitirá reunido esta respuesta).
La posterior investigación encontró, finalmente, unos más eventos que hemos encontrado útiles:
System.Windows.Forms.Application.ThreadExit
- Se activa cuando las salidas de un bucle de mensajes
System.Windows.Forms.Application.ApplicationExit
- Se activa cuando todos los bucles de mensajes de salida
System.AppDomain.CurrentDomain.DomainUnload
- Se activa cuando un dominio que no sea las salidas predeterminadas
System.AppDomain.CurrentDomain.ProcessExit
- Se activa cuando las salidas de dominio de aplicaciones por defecto
System.AppDomain.CurrentDomain.UnhandledException
-. Se activa cuando se produce una excepción no capturada, terminando la aplicación
Sólo son posibles uno de los eventos DomainUnload
o ProcessExit
para un dominio aplicación dada, dependiendo de si es el valor predeterminado de dominio (de nivel superior) para el proceso o se ha creado como un subdominio (por ejemplo. En un servidor web). Si una aplicación no sabe lo que podría ser (como en nuestro caso), tiene que suscribirse a ambos si se quiere atrapar la descarga real por sí mismo. Además, parece que UnhandledException
(que a partir de .NET2.0 es siempre fatal) puede impedir que los otros dos eventos, por lo que puede haber un tercer caso de manejar. Estos tres eventos deben trabajar para cualquier aplicación .NET.
Hay una advertencia de que el tiempo de ejecución para ProcessExit
está limitada (unos 4 segundos?), Por lo que puede que no sea posible hacer una amplia obra "final" en ese controlador de eventos. Tiene que ser algo que se puede hacer rápidamente.
Los eventos Application
sólo se aplican a las aplicaciones de Windows Forms (sospechamos que podrían no funcionar en aplicaciones WPF puros, sin embargo). El nombramiento puede ser engañoso, ya que se conocen por su uso normal más básico que tiene ciertas suposiciones. ThreadExit
no se refiere a la System.Threading.Thread
real, sino más bien para el bucle de mensajes (Application.Run()
)) de un hilo de interfaz de usuario, y ApplicationExit
se refiere de manera similar a la recogida de las formas de aplicación en uno o más hilos de interfaz de usuario. Normalmente, una vez que la llamada a Application.Run()
devoluciones, llamadas del método de introducción de un hilo, el método de introducción concluye con rapidez y el hilo en sí y luego termina. Y una vez que todos los hilos de la interfaz de usuario han salido, una aplicación de Windows Forms es por lo general todo hecho y salidas.
Otro caso de la nota es el caso System.Windows.Forms.Application.ThreadException
. Un bucle de mensajes de Windows se puede configurar para capturar las excepciones que se producen en el manejo de un mensaje y enviar este evento en lugar de dejarlos ser no detectadas (y por lo tanto fatales) excepciones. La captura de estas excepciones permite que el bucle de mensaje (y ese hilo UI) continúe funcionando (después de abortar el controlador de mensajes actual). Sólo puede haber un abonado a este evento en cualquier momento por un hilo dado (suscripciones sobreescriben cualquier suscriptor anterior), y debe ser configurado antes de que se crea y se suscribió antes de entrar en el bucle de mensajes a cualquier forma. Consulte la ayuda de MSDN para este evento y System.Windows.Forms.Applicaton.SetUnhandledExceptionMode()
para obtener más información.