使用任务并行库时如何处理所有未处理的异常?

我正在使用.NET4.0中的TPL(任务并行库)。我想通过使用Thread.GetDomain().UnhandledException事件来集中处理所有未处理异常的逻辑。但是,在我的应用程序中,对于使用TPL代码启动的线程,例如,Task.Factory.StartNew(…),永远不会触发该事件。如果我使用类似于new Thread(threadStart).Start()的东西,则确实会触发该事件

这篇MSDN文章建议在使用TPL时使用Task.Wait()捕获aggregateeexception,但这不是我想要的,因为这种机制不够“集中化”

有人经历过同样的问题吗?还是只有我?你有什么解决办法吗

我认为TaskScheduler.UnobservedTaskeException事件就是您想要的:

在即将触发故障任务的未观察到的异常时发生
异常升级策略,默认情况下,该策略将终止
过程

因此,此事件类似于您在问题中提到的DomainUnhandledException,但仅针对任务发生

顺便说一句,未观察到的例外政策(是的,这不是一个未观察到的例外,MS guys发明了新单词…再次),从.NET4.0更改为.NET4.5。在.NET 4.0中,未观察到的异常会导致进程终止,但在.NET 4.5中,则不会。这都是因为我们将在C#5和VB11中使用新的异步功能

发表评论