ASP.NET 后台线程异常处理

4
在我的3.5 .net web应用程序中,我有一个后台线程来处理大量的工作(该应用程序类似于mint.com,因为它在后台线程上执行大量的账户聚合)。我在执行聚合的线程中进行了广泛的异常处理,但仍有可能抛出未处理的异常,导致整个应用程序崩溃。我读了一些关于这个主题的文章,但它们都似乎过时了,没有实现标准的方法。现在是否有标准方法来解决这个问题?在ASP.NET 4.0中是否有更好的处理方式?
2个回答

3
可以说,如果出现未处理的异常,整个应用程序都应该停止。 未处理的异常意味着您的程序处于未知/不确定状态,任何进一步处理或用户交互都可能导致程序状态的损坏,甚至更糟糕的是数据损坏。
在线程工作中处理异常是正确的做法。据我所知,.NET应用程序没有办法在后台线程上“优雅”地处理未处理的异常 - 它们将始终终止进程。
某些.NET Framework类(例如BackgroundWorker组件和.NET 4中的Task Parallel Library)使多线程编程更加容易,并且为您处理了很多异常处理的脏活,因此如果可以使用这些而不是实现自己的多线程代码,则应该绝对这样做。 但是,如果这些在特定情况下无法帮助您,如果必须使用ThreadPool或纯Thread,则一定不要让任何未处理的异常逃脱。

2

你可以在你的工作线程周围放置一个try/catch块,就像在线程启动时一样。我假设这已经是你正在做的事情,或者类似于此。但请记住,你绝对不想将未知错误转化为无声的未知错误,因为这样当出现问题时,它将会更加难以追踪。确保你将异常记录到EventLog或自定义应用程序日志中,如果你只想捕获它并忘记它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接