TPL打破未处理的异常

时间:2013-05-01 23:33:09

标签: c# visual-studio debugging exception-handling async-await

我在我的应用程序中使用async await以及Task.Factory.StartNew,但我注意到的一件事是,当发生未处理的异常时,visual studio不再破坏

我的意思是before using await enter image description here

但在我将方法转换为Task并使用等待

之后

enter image description here

它仅在视觉工作室的输出区域中捕获...

顺便说一下:对我来说很奇怪,因为我是.Net4.5的新手。请原谅我,如果没有说明我需要的具体内容,那么我想知道的是

  • 如何使用视觉工作室打破异常 async await

2 个答案:

答案 0 :(得分:6)

当调试器显示“Exception未被用户代码处理”时,这意味着异常已传播到框架。由于async Task方法将其异常放在其返回的Task上,因此异常不会传播到框架。像这样的例外是 unobserved

如果希望调试器在抛出异常时中断,则使用Debugger - >例外 - >检查CLR异常的“Thrown”框。

如果您想观察例外情况,请change from TaskFactory.StartNew to Task.Run并在返回的Wait上致电Task。这会将异常(包含在AggregateException中)通过Main传播到框架。

答案 1 :(得分:1)

这就是为什么 void 返回 async 方法是邪恶的。

在第一种情况下,没有捕获异常,调试器正在提醒您。

在第二种情况下,它将在结果任务上。

如果你处理方法中的异常,你会看到类似的行为。

Task.Run只是TaskFactory.StartNew的简化版本:Task.Run vs Task.Factory.StartNew