异常永远不会到达异步方法 (C#) 中的处理程序

本文关键字:程序 处理 异步方法 永远 异常 | 更新日期: 2023-09-27 18:25:16

我有一个简单的结构,我很难理解为什么它工作(或不起作用(我认为它应该如何工作。

基本上,有两种方法

private async void DoStuff()
{
    try {
        AuthenticationStuff();
    }catch(UnauthorizedAccessException){
        UI.Display("AMAGAD!");
    }
}
private async void AuthenticationStuff()
{
    var user = GetUser();
    if(user == null) throw new UnauthorizedAccessException();
    DoMoreAuthenticationStuff();
}

现在的问题是异常永远不会到达DoStuff()方法的处理程序。我的第一直觉是"嘿,这是一种异步方法,我必须等待它",但我也不能这样做,因为显然异步 void 与异步 Task<void> 不同。

我试图了解这里发生了什么。为什么异常没有转到处理程序,而是调试器在 "DoMoreAuthenticationStuff() " 中断并出现未处理的异常错误?

异常永远不会到达异步方法 (C#) 中的处理程序

async void 方法引发的异常直接转到方法启动时处于活动状态的SynchronizationContext。这是您应该避免的原因之一 async void .我在 MSDN 文章异步编程中的最佳做法中介绍了这个原因和其他原因。

若要捕获此类异常,请将async void方法更改为async Taskawait返回的任务。

我的第一直觉是"嘿,这是一种异步方法,我必须等待。 它",但我也不能这样做,因为显然异步 void 是不同的 从异步任务。

你可以说async Task MyMethod().然后,您可以等待其结果传播异常(并等待完成(。

另请观察Stephen Cleary的回答以获取更多详细信息。