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

标签 c# .net exception

我可以连接到 AppDomain.CurrentDomain.UnhandledException 以记录来自后台线程的异常,但如何防止它们终止运行时?

最佳答案

首先,您真的应该尽量不要在后台线程中抛出异常而不处理异常。如果您控制委托(delegate)的运行方式,请将其封装在一个 try catch block 中,并想出一种方法将异常信息传递回您的主线程(如果您显式调用了 BeginInvoke,则使用 E​​ndInvoke,或者通过在某处更新一些共享状态)。

忽略未处理的异常可能很危险。如果您遇到真正无法处理的异常(想到 OutOfMemoryException),无论如何您都无能为力,您的流程基本上注定要失败。

回到 .Net 1.1,后台线程中未处理的异常会被抛到任何地方,主线程会很乐意继续执行。这可能会产生恶劣的影响。所以在 .Net 2.0 中,这种行为发生了变化。

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

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

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

<configuration>
  <runtime>
    <!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
    <legacyUnhandledExceptionPolicy enabled="1" />
  </runtime>
</configuration>

不过,它似乎不适用于 ASP.NET。

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

关于c# - 如何防止后台线程中的异常终止应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/186854/

相关文章:

c# - NuGet 包将非托管 dll 复制到根目录而不是 bin

c# - 将多个委托(delegate)添加到 Func<T> 并返回第一个 lambda 委托(delegate) (C#) 的结果?

c# - 通过 CSharpCodeProvider 编译时出现编译器错误

c# - 使用反射和 PropertyInfo 无法识别我的枚举

java - 处理正整数的异常

c# - 在处理 SqlConnection、SqlDataReader、SqlCommand 时要捕获哪些异常?

c# - X509Certificate2 构造函数中的 "The specified network password is not correct"异常

c# - 使用 Microsoft.Build.Evaluation 发布数据库项目 (.sqlproj)

c# - Web 应用程序中的安全方法

C# <-> Java 套接字通信