ASP.NET 应用程序应该如何处理非请求后台线程上发生的未处理的异常(由于错误)?
默认情况下,此类异常会导致进程终止。这在 ASP.NET 工作进程的设置中是不可接受的因为并发运行的请求会不可预测地中止。这也是一个性能问题。
请求线程上的异常不是问题,因为 ASP.NET 会处理它们(通过显示错误页面)。
The AppDomain.UnhandledException
事件允许观察异常的发生,但此时无法阻止终止。
这是需要粘贴到 ASPX 页面代码隐藏中的重现。
protected void Page_Load(object sender, EventArgs e)
{
var thread = new Thread(() =>
{
throw new InvalidOperationException("some failure on a helper thread");
});
thread.Start();
thread.Join();
}
我所知道的唯一解决方案是永远不要让异常“逃逸”而未处理。是否还有其他更全面、更彻底的解决方案?
Rx(响应式编程)就是为了解决这样的问题而诞生的,尝试考虑改变你现在使用的框架,换成Rx
http://msdn.microsoft.com/en-us/data/gg577609.aspx http://msdn.microsoft.com/en-us/data/gg577609.aspx
掘金包:
https://nuget.org/packages/Rx-Main/1.0.11226 https://nuget.org/packages/Rx-Main/1.0.11226
这是等效的 Rx 代码:
var o = Observable.Start(() => { throw new NotImplementedException(); });
o.Subscribe(
onNext => { },
onError => { },
() => { Console.WriteLine("Operation done"); });
正如您所看到的,当您指定一个时,错误不会转义后台线程错误处理程序, onError => { }
如果不指定错误处理程序,异常将被传播:
o.Subscribe(
onNext => { },
() => { Console.WriteLine("Operation done"); });
在上面的示例中,异常将被传播并会导致与您发布的代码相同的问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)