我在我的应用程序中使用async
await
以及Task.Factory.StartNew
,但我注意到的一件事是,当发生未处理的异常时,visual studio不再破坏
我的意思是before using await
但在我将方法转换为Task
并使用等待
它仅在视觉工作室的输出区域中捕获...
顺便说一下:对我来说很奇怪,因为我是.Net4.5的新手。请原谅我,如果没有说明我需要的具体内容,那么我想知道的是答案 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