TPL打破未处理的exception
我在我的应用程序中使用async
await
以及Task.Factory.StartNew
,但我注意到的一件事是,当未处理的exception发生时,visual studio不再破坏
这是我before using await
意思
但在我将一个方法转换为一个Task
并使用await之后
它仅在视觉工作室的输出区域中捕获…
顺便说一下:对我来说很奇怪,因为我是.Net4.5的新手,请原谅我,如果没有说明我需要的具体内容,那么我想知道的是
- 当使用异步等待时,我怎样才能使视觉工作室中断exception
当调试器说“Exception未被用户代码处理”时,这意味着exception已经传播到框架。 由于async Task
方法将其exception放在其返回的Task
,因此exception不会传播到框架。 像这样的例外是未被观察到的 。
如果希望调试器在抛出exception时中断,则使用Debugger – > Exceptions – >检查CLR Exceptions的“Thrown”框。
如果要观察exception, 则从TaskFactory.StartNew
更改为Task.Run
并在返回的Task
上调用Wait
。 这将通过Main
传播exception(包装在AggregateException
),直到框架。
这就是为什么无效返回异步方法是邪恶的。
在第一种情况下,没有捕获exception,调试器正在提醒您这一点。
在第二种情况下,它将在结果任务上。
如果您处理方法中的exception,您将看到类似的行为。
Task.Run只是TaskFactory.StartNew的简化版本: Task.Run vs Task.Factory.StartNew