2013-05-01 59 views
3

我使用asyncawait以及在我的应用程序Task.Factory.StartNew但有一两件事,我发现改变的是,Visual Studio是没有当未处理的异常出现TPL歇上未处理的异常

这里更多的断裂是我的意思before using await enter image description here

,但我把一个方法为Task和使用后等待

enter image description here

它只能在Visual Studio中的输出区域捕获...

BTW:这对我来说是很奇怪的,因为我是新来的.Net4.5请原谅我,如果失败了,说明我需要什么特别,但再次我想知道什么是

  • 使用 异步时,我怎么可能做出例外的Visual Studio休息等待

回答

5

当调试器说“异常是由用户代码未处理的”,这意味着什么是一个例外已经传播到框架2 RK。由于async Task方法在其返回的Task上设置了例外,因此该异常不会传播到框架。像这样的例外是未观测到

如果您希望调试程序在例外情况发生时打破,请使用Debugger - > Exceptions - >检查CLR Exceptions的“Thrown”框。

如果你想观察的异常,那么change from TaskFactory.StartNew to Task.Run,并呼吁恢复TaskWait。这将通过Main传播异常(包装在AggregateException中),直至框架。

0

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

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

第二种情况将出现在结果任务上。

如果处理方法内部的异常,您将看到类似的行为。

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