如何检测应用程序何时终止?

61 .net c# multithreading appdomain

这是我最初的问题的后续内容,我想提出我的发现并要求更正,想法和见解.我的发现(或者更确切地说是解释)来自人们对我之前的问题的回答,阅读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卸载以外时引发,例如在运行带有单元测试框架的类时(带有TestDriven.NET的MbUnit).

  • System.AppDomain.CurrentDomain.UnhandledException:(如果在默认情况下处理AppDomain:)为任何线程中的任何未处理的异常引发,无论AppDomain线程是什么开始.这意味着,这可以用作所有未处理异常的catch-all.

  • System.Windows.Application.Exit:当WPF应用程序(即默认值AppDomain)正常退出时引发.覆盖System.Windows.Application.OnExit以利用它.

  • 终结器(C#中的析构函数):当垃圾收集器释放非托管资源时运行.[总执行时间有限!].

活动顺序:

WPF应用程序:优雅退出

  1. System.Windows.Application.Exit
  2. System.AppDomain.CurrentDomain.ProcessExit
  3. 终结

WPF应用程序:未处理的异常

  1. System.AppDomain.CurrentDomain.UnhandledException

在TestDriven.NET中运行的MbUnit:通过测试(优雅退出)

  1. System.AppDomain.CurrentDomain.DomainUnload
  2. 终结

在TestDriven.NET中运行的MbUnit:测试失败(未处理的异常由MbUnit处理)

  1. AppDomain.CurrentDomain.DomainUnload
  2. 终结

问题:

  • 我的解释/发现是否正确?
  • 你知道我遗漏的更多细节吗?例如,终结者的总执行时间是多少?
  • 你知道我知道的其他事件/想法吗?
  • 有哪些事件以及它们在其他应用程序中引发的顺序,例如Windows窗体,Web服务,ASP.NET网站等?

Ray*_*Ray 7

由ssg31415926的问题/答案提示(这个问题有点颠倒),还有当用户注销或关闭时调用的Application.SessionEnding.它在Exit事件之前调用.