0

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

基本上有两种方法

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()" 处中断并出现未处理的异常错误?

4

2 回答 2

2

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

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

于 2013-07-29T11:53:08.503 回答
0

我的第一直觉是“嘿,这是一个异步方法,我必须等待它”,但我也不能这样做,因为显然 async void 与 async Task 不同。

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

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

于 2013-07-29T12:15:31.470 回答