当前位置:  开发笔记 > 编程语言 > 正文

如何防止后台线程中的异常终止应用程序?

如何解决《如何防止后台线程中的异常终止应用程序?》经验,为你挑选了2个好方法。

我可以连接AppDomain.CurrentDomain.UnhandledException从后台线程记录异常,但是如何阻止它们终止运行时?



1> 小智..:

首先,你真的应该尽量不在后台线程中抛出异常 - 而不是处理异常.如果您控制代理的运行方式,请将其封装在try catch块中,并找到将异常信息传递回主线程的方法(如果您显式调用BeginInvoke,则使用EndInvoke,或者通过更新某些共享状态).

忽略未处理的异常可能很危险.如果你有一个真正的不可处理的异常(想到OutOfMemoryException),你无论如何都无法做到,你的过程基本上就注定了.

回到.Net 1.1,后台线程中的未处理异常将被抛到无处,主线程很乐意继续.这可能会产生令人讨厌的反响.所以在.Net 2.0中,这种行为发生了变化.

现在,在一个不是主线程的线程中抛出的未处理异常将终止该进程.您可能会收到此通知(通过在AppDomain上订阅该事件),但该过程仍然会死亡.

由于这可能不方便(当你不知道将在线程中运行什么并且你不完全确定它被正确保护,并且你的主线程必须具有弹性)时,有一种解决方法.它旨在作为遗留设置(意思是,强烈建议您确保没有杂散线程),但您可以通过这种方式强制执行前一种行为:

只需将此设置添加到您的服务/应用程序/任何配置文件:


  
    
    
  

但它似乎不适用于ASP.NET.

有关更多信息(以及在即将发布的CLR版本中可能不支持此设置的巨大警告),请参阅http://msdn.microsoft.com/en-us/library/ms228965.aspx



2> Mitch Wheat..:

来自Joe Albahari的优秀线程文章:

.NET框架为全局异常处理提供了一个较低级别的事件:AppDomain.UnhandledException.当任何线程和任何类型的应用程序(有或没有用户界面)中存在未处理的异常时,将触发此事件.但是,虽然它提供了一个很好的最后一种机制来记录未捕获的异常,但它没有提供阻止应用程序关闭的方法 - 也没有办法抑制.NET未处理的异常对话框.

在生产应用程序中,所有线程入口方法都需要显式异常处理.可以通过使用包装器或辅助类来执行作业来减少工作,例如BackgroundWorker(在第3部分中讨论).

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有