这是我最初问题的后续,我想介绍我的发现并要求更正、想法和见解。我的发现(或者更确切地说是解释)来自人们对我之前的问题的回答,即阅读 MSDN .NET 3.5 文档和调试 .NET 3.5 代码。我希望这对像我一样想知道如何检测应用程序何时终止的人来说是有价值的。
事件:
System.AppDomain.CurrentDomain.ProcessExit
: 在进程退出时引发,例如在默认值AppDomain
和其他所有内容被卸载后[总执行时间仅限于 3 秒!]。对于 WPF,请System.Windows.Application.Exit
改用。对于 Windows 窗体,Application.Run(...)
在 main 方法之后运行代码。System.AppDomain.CurrentDomain.DomainUnload
:在AppDomain
非默认AppDomain
卸载时引发,例如在使用单元测试框架(MbUnit 和 TestDriven.NET)运行类时。System.AppDomain.CurrentDomain.UnhandledException
: (如果默认处理AppDomain
:) 为任何线程中的任何未处理异常引发,无论AppDomain
线程从什么开始。这意味着,这可以用作所有未处理异常的包罗万象。System.Windows.Application.Exit
:当 WPF 应用程序(即默认AppDomain
)正常退出时引发。覆盖System.Windows.Application.OnExit
以利用它。终结器(C# 中的析构函数):在垃圾收集器释放非托管资源时运行。[总执行时间有限!]。
事件顺序:
WPF 应用程序:优雅退出
System.Windows.Application.Exit
System.AppDomain.CurrentDomain.ProcessExit
- 终结者
WPF 应用程序:未处理的异常
System.AppDomain.CurrentDomain.UnhandledException
在 TestDriven.NET 中运行的 MbUnit:通过测试(优雅退出)
System.AppDomain.CurrentDomain.DomainUnload
- 终结者
MbUnit 在 TestDriven.NET 中运行:测试失败(未处理的异常由 MbUnit 处理)
AppDomain.CurrentDomain.DomainUnload
- 终结者
问题:
- 我的解释/发现是否正确?
- 你知道我遗漏的更多细节吗?例如,终结器的总执行时间是多少?
- 你知道我知道的任何其他事件/想法吗?
- 有哪些事件,它们在其他应用程序(例如 Windows 窗体、Web 服务、ASP.NET 网站等)中引发的顺序是什么?