我有一个包含很多线程的控制台应用程序.有些线程可以监视某些条件,如果它们是真的则终止程序.这种终止可以随时发生.
我需要一个可以在程序关闭时触发的事件,以便我可以清理所有其他线程并正确关闭所有文件句柄和连接.我不确定.NET框架中是否已经内置了一个,所以我在编写自己的框架之前就已经问过了.
我想知道是否有一个事件:
MyConsoleProgram.OnExit += CleanupBeforeExit;
Run Code Online (Sandbox Code Playgroud) 这是我最初的问题的后续内容,我想提出我的发现并要求更正,想法和见解.我的发现(或者更确切地说是解释)来自人们对我之前的问题的回答,阅读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应用程序:优雅退出
System.Windows.Application.ExitSystem.AppDomain.CurrentDomain.ProcessExitWPF应用程序:未处理的异常
System.AppDomain.CurrentDomain.UnhandledException在TestDriven.NET中运行的MbUnit:通过测试(优雅退出)
System.AppDomain.CurrentDomain.DomainUnload在TestDriven.NET中运行的MbUnit:测试失败(未处理的异常由MbUnit处理)
AppDomain.CurrentDomain.DomainUnload问题:
当我需要在关闭应用程序之前使用Stop()函数停止后台线程时,我有简单的应用程序.问题是我的Main()函数有几个退出点(return语句)
static void Main(string[] args)
{
/// some code
return;
// some code
return;
//// etc
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用AppDomain.CurrentDomain.ProcessExit作为清理的标志位置,但它永远不会被调用(至少在有后台线程时).有没有办法找出一些很好的方法来实现它?