¿El trabajo evento Application.ApplicationExit a ser notificado de salida en aplicaciones que no son Winforms?

StackOverflow https://stackoverflow.com/questions/529867

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 #.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top