Это продолжение моего начального вопроса, и я хотел бы представить свои выводы и запросить исправления, идеи и идеи. Мои выводы (или, скорее, интерпретации) исходят от ответов людей на мой предыдущий вопрос, читая документацию MSDN.NET 3.5 и отлаживая код .NET 3.5. Надеюсь, это будет полезно для тех, кто задавался вопросом, как я обнаруживаю, когда приложение прекращается.
События:
-
System.AppDomain.CurrentDomain.ProcessExit
: повышается, когда процесс завершается, например. после по умолчаниюAppDomain
и все остальное было выгружено [Общее время выполнения ограничено всего 3 секунды!]. Для WPF используйтеSystem.Windows.Application.Exit
вместо этого. Для Windows Forms запустите код послеApplication.Run(...)
в основном методе. -
System.AppDomain.CurrentDomain.DomainUnload
: поднят, когдаAppDomain
отличается от по умолчаниюAppDomain
выгружает, например. при запуске классов с модульными модулями тестирования (MbUnit с TestDriven.NET). -
System.AppDomain.CurrentDomain.UnhandledException
: (если обрабатывается по умолчаниюAppDomain
:), поднятый для любого необработанного исключения в любом потоке, независимо от того, какойAppDomain
был запущен поток. Это означает, что это можно использовать как catch -все для всех необработанных исключений. -
System.Windows.Application.Exit
: поднят, когда приложение WPF (т.е. по умолчаниюAppDomain
) выходит изящно. ПереопределитеSystem.Windows.Application.OnExit
, чтобы воспользоваться им. -
Финализаторы (деструкторы в С#): запускаются, когда сборщик мусора освобождает неуправляемые ресурсы. [Общее время выполнения ограничено!].
Порядок событий:
Приложение WPF: изящный выход
-
System.Windows.Application.Exit
-
System.AppDomain.CurrentDomain.ProcessExit
- Финализаторы
Приложение WPF: необработанное исключение
-
System.AppDomain.CurrentDomain.UnhandledException
MbUnit работает внутри TestDriven.NET: прошел тест (изящный выход)
-
System.AppDomain.CurrentDomain.DomainUnload
- Финализаторы
MbUnit работает внутри TestDriven.NET: сбой теста (необработанные исключения обрабатываются MbUnit)
-
AppDomain.CurrentDomain.DomainUnload
- Финализаторы
Вопросы:
- Являются ли мои интерпретации/выводы правильными?
- Знаете ли вы более подробную информацию о том, что у меня есть опущены? Например. какова общая сумма время выполнения для финализаторов?
- Знаете ли вы о других событиях/ идеи, о которых я знаю?
- Какие события существуют и какой порядок они поднимают в других приложениях, например. Windows Forms, веб-сервис, веб-сайт ASP.NET и т.д.