debugging器不会在asynchronous方法中打破/停止exception

当一个debugging器连接到一个.NET进程时,它通常会在引发未处理的exception时停止。

但是,当你在一个async方法,这似乎不工作。

我以前尝试过的场景在以下代码中列出:

 class Program { static void Main() { // Debugger stopps correctly Task.Run(() => SyncOp()); // Debugger doesn't stop Task.Run(async () => SyncOp()); // Debugger doesn't stop Task.Run((Func<Task>)AsyncTaskOp); // Debugger stops on "Wait()" with "AggregateException" Task.Run(() => AsyncTaskOp().Wait()); // Throws "Exceptions was unhandled by user code" on "await" Task.Run(() => AsyncVoidOp()); Thread.Sleep(2000); } static void SyncOp() { throw new Exception("Exception in sync method"); } async static void AsyncVoidOp() { await AsyncTaskOp(); } async static Task AsyncTaskOp() { await Task.Delay(300); throw new Exception("Exception in async method"); } } 

我错过了什么吗? 如何使debugging器打破/停止AsyncTaskOp()的exception?

Debug菜单下,selectExceptions... 在“例外”对话框的“ Common Language Runtime Exceptions旁边,选中“ Thrown框。

我想听听有没有人发现如何解决这个问题? 也许在最新的视觉工作室的设置…?

一个讨厌但可行的解决scheme(就我而言)是抛出我自己的自定义exception,然后修改斯蒂芬·克莱里的答案:

在debugging菜单下,select例外(您可以使用此键盘快捷键Ctrl + Alt + E )…在例外对话框中,公共语言运行时例外行旁边检查投掷框。

更具体的,即添加您的自定义例外到列表中,然后勾选其“投掷”框。

例如:

 async static Task AsyncTaskOp() { await Task.Delay(300); throw new MyCustomException("Exception in async method"); } 

我在Task.Run(() =>中的try / catch中包装了匿名委托。

 Task.Run(() => { try { SyncOp()); } catch (Exception ex) { throw; // <--- Put your debugger break point here. // You can also add the exception to a common collection of exceptions found inside the threads so you can weed through them for logging } });