异步方法中的异常调试器未中断/停止

当调试器附加到.NET 进程时,它(通常)在引发未处理的异常时停止。

但是,当您使用 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");
}
}

我是否遗漏了什么? 我怎样才能使调试器在 AsyncTaskOp()中的异常中断/停止?

16856 次浏览

Debug菜单下,选择 Exceptions...。在异常对话框中,在 Common Language Runtime Exceptions行旁边选中 Thrown框。

我已经将匿名委托包装在 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
}


});

我想知道有没有人知道怎么解决这个问题?也许在最新的视觉工作室设置... ?

一个讨厌但可行的解决方案(在我的例子中)是抛出我自己的 习俗异常,然后修改 Stephen Cleary 的答案:

在“调试”菜单下,选择“异常”(你可以使用这个快捷键 Control + Alt + E) ... 在“异常”对话框中,在“异常”通用语言运行库旁边选择“抛出” 方框

更具体地说,例如,将 习俗异常添加到列表中,然后勾选它的“抛出”框。

例如:

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