4

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

这就是我的意思before using await 在此处输入图像描述

但是在我把一个方法变成一个Task并使用等待之后

在此处输入图像描述

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

顺便说一句:这对我来说很奇怪,因为我是 .Net4.5 的新手,如果未能说明我具体需要什么,请原谅我,但我想知道的是

  • 使用异步等待时如何使 Visual Studio 中断异常
4

2 回答 2

6

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

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

如果要观察异常,则从 更改TaskFactory.StartNewTask.Run并调用Wait返回的Task。这会将异常(包装在 中AggregateException)通过Main并向上传播到框架。

于 2013-05-02T00:01:55.410 回答
1

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

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

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

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

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

于 2013-05-02T01:48:24.280 回答