异常从未到达异步方法中的处理程序(C#)

时间:2013-07-29 11:48:01

标签: c# exception asynchronous exception-handling

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

基本上,有两种方法

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()方法的处理程序。我的第一直觉是“嘿,这是一种异步方法,我必须等待它”,但我不能这样做,因为显然async void与async Task<void>不同。

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

2 个答案:

答案 0 :(得分:2)

async void方法引发的异常直接转到方法启动时处于活动状态的SynchronizationContext。这是您应该避免async void的原因之一。我在MSDN文章Best Practices in Asynchronous Programming中介绍了这个和其他原因。

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

答案 1 :(得分:0)

  

我的第一直觉是&#34;嘿,这是一种异步方法,我必须等待   它&#34;,但我无法做到这一点,因为显然异步无效是不同的   来自异步任务。

你可以说async Task MyMethod()。然后你可以等待它的结果传播异常(并等待完成)。

另请参阅Stephen Cleary的回答了解更多详情。