Este es un seguimiento de mi initial question y me gustaría presentar mis hallazgos y solicitar correcciones, ideas y perspectivas. Mis hallazgos (o más bien interpretaciones) provienen de las respuestas de las personas a mi pregunta anterior, leyendo la documentación de MSDN .NET 3.5 y depurando el código de .NET 3.5. Espero que esto sea valioso para alguien que se preguntaba cómo detectar cuándo finaliza una aplicación.¿Cómo detectar cuando finaliza la aplicación?
Eventos:
System.AppDomain.CurrentDomain.ProcessExit
: planteadas cuando las salidas de proceso, por ejemplo, después delAppDomain
predeterminado y todo lo demás se descargó [El tiempo de ejecución total está limitado a solo 3 segundos!]. Para WPF, useSystem.Windows.Application.Exit
en su lugar. Para Windows Forms, ejecute el código después deApplication.Run(...)
en el método principal.System.AppDomain.CurrentDomain.DomainUnload
: plantearon cuando unAppDomain
distinto predeterminadoAppDomain
se descargue, por ejemplo cuando se ejecutan clases con marcos de prueba de unidades (MbUnit con TestDriven.NET).System.AppDomain.CurrentDomain.UnhandledException
: (si se maneja en su defectoAppDomain
:) levantó para cualquier excepción no controlada en cualquier tema, no importa loAppDomain
el hilo se inició en este medio, esto puede ser usado como el cajón de sastre para todas las excepciones no controladas..System.Windows.Application.Exit
: se genera cuando la aplicación WPF (es decir, el valor predeterminadoAppDomain
) sale correctamente. AnuleSystem.Windows.Application.OnExit
para aprovecharlo.Finalizadores (destructores en C#): se ejecuta cuando el recolector de basura libera recursos no administrados. [El tiempo total de ejecución es limitado!].
orden de los acontecimientos:
aplicación de WPF: salida elegante
System.Windows.Application.Exit
System.AppDomain.CurrentDomain.ProcessExit
- finalizadores
aplicación WPF: excepción no controlada
System.AppDomain.CurrentDomain.UnhandledException
MbUnit ejecuta dentro TestDriven.NET: prueba superada (salida elegante)
System.AppDomain.CurrentDomain.DomainUnload
- finalizadores
MbUnit ejecutándose dentro de TestDriven.NET: fallado la prueba (las excepciones no controladas son manejados por MbUnit)
AppDomain.CurrentDomain.DomainUnload
- finalizadores
Preguntas:
- son mis interpretaciones/hallazgos correcta?
- ¿Usted sabe de más detalles que tengo dejado afuera? P.ej. ¿Cuál es el tiempo total de ejecución para los finalizadores?
- ¿Conoces otros eventos/ ideas que tenga en cuenta?
- Qué eventos hay y qué orden se obtienen en otras aplicaciones, p. Formularios de Windows, servicio web, sitio web ASP.NET, etc.
Sólo una nota/FYI: esto sólo está disponible en 3.0 + NET, deberá vincular contra System.Core.dll utilizar en .NET 2.0 –