我有一个简单的结构,我很难理解它为什么工作(或不工作)我认为它应该如何工作。
基本上,有两种方法
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()
处中断并且出现未解决的异常错误?
答案 0 :(得分:2)
async void
方法引发的异常直接转到方法启动时处于活动状态的SynchronizationContext
。这是您应该避免async void
的原因之一。我在MSDN文章Best Practices in Asynchronous Programming中介绍了这个和其他原因。
要捕获此类异常,请将async void
方法更改为async Task
和await
返回的任务。
答案 1 :(得分:0)
我的第一直觉是&#34;嘿,这是一种异步方法,我必须等待 它&#34;,但我无法做到这一点,因为显然异步无效是不同的 来自异步任务。
你可以说async Task MyMethod()
。然后你可以等待它的结果传播异常(并等待完成)。
另请参阅Stephen Cleary的回答了解更多详情。