asp.net后台线程异常处理

时间:2010-04-16 20:34:47

标签: asp.net multithreading exception

在我的3.5 .net网络应用程序中,我有一个后台线程做了很多工作(该应用程序类似于mint.com,因为它在后台线程上进行了大量的帐户聚合)。我在执行聚合的线程中进行了大量的异常处理,但总是有可能抛出未处理的异常并且我的整个应用程序将会死亡。我已经阅读了一些关于这个主题的文章,但它们看起来都已经过时了,没有一个实现标准方法。现在有一个标准的方法吗?在ASP.NET 4.0中有没有更好的方法来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

可以说,如果你有一个未处理的异常,整个应用程序应该死掉。未处理的异常意味着您的程序处于未知/不确定状态,任何进一步的处理或用户交互都可能导致程序状态损坏,或者更糟糕的是数据损坏。

您正在处理线程工作中的异常。据我所知,.NET应用程序无法“优雅地”处理后台线程上未处理的异常 - 它们总是终止进程。

某些.NET Framework类(例如{4}}组件和.NET 4中的任务并行库使多线程更容易并处理大量异常处理的脏工作为你,所以如果你可以使用那些而不是来实现你自己的多线程代码,那么你肯定应该这样做。但如果那些在某种情况下无法帮助你,如果你必须使用BackgroundWorker或纯ThreadPool,那么一定不要让任何未处理的异常逃脱。

答案 1 :(得分:1)

你可以随时在你的工作线程周围放置一个try / catch块,就像线程启动时一样。我假设这是你已经在做的,或类似的东西。但请记住,您绝对不希望将未知错误转换为 silent 未知错误,因为当某些事情发生时,很多会更难以追踪出错。如果你想抓住并忘记它,请确保将异常记录到EventLog或自定义应用程序日志中。

就像Aaronaught所说,当意外发生时,应用程序应该死掉。但是我没有看到让你的后台线程退出/死掉而不是降低整个应用程序进程的问题(事实上,我不认为Aaron在这里是正确的,它不会杀死整个过程)我认为您的问题基本上可以翻译为“ASP.NET中有什么神奇的东西会突然解决我甚至不知道的问题吗?”当然,答案是否定的。但你已经知道了。 :)