TPL在未处理的异常情况下中断执行

4
我在我的应用程序中使用了async await以及Task.Factory.StartNew,但我注意到一个改变是在发生未处理异常时Visual Studio不再中断。在使用await之前的情况如下所示: enter image description here 但是在将方法转换为Task并使用await后,异常只会在Visual Studio的输出区域中捕获,如下所示: enter image description here 这对我来说非常奇怪,因为我是新手。如果没能清楚地表达我的需求,请谅解。我想知道的是:
  • 当使用async await时,如何让Visual Studio在异常发生时中断。
2个回答

6
当调试器显示“用户代码未处理异常”时,意味着异常已经传播到框架。由于async Task方法将其异常放置在返回的Task上,因此异常不会传播到框架。这样的异常是未被观察到的。
如果您希望调试器在抛出异常时中断,则使用调试器 -> 异常 -> 选中CLR异常的“抛出”框。
如果您想要观察异常,则TaskFactory.StartNew更改为Task.Run并在返回的Task上调用Wait。这将通过Main将异常(包装在AggregateException中)传播到框架。

1
这就是为什么返回voidasync方法是有问题的。
在第一种情况下,异常未被捕获,调试器会警告你。
在第二种情况下,异常将出现在生成的任务中。
如果在方法内部处理异常,你会看到类似的行为。
Task.Run只是TaskFactory.StartNew的简化版本: Task.Run vs Task.Factory.StartNew

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