异常永远不会到达异步方法 (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()
" 中断并出现未处理的异常错误?
async void
方法引发的异常直接转到方法启动时处于活动状态的SynchronizationContext
。这是您应该避免的原因之一 async void
.我在 MSDN 文章异步编程中的最佳做法中介绍了这个原因和其他原因。
若要捕获此类异常,请将async void
方法更改为async Task
并await
返回的任务。
我的第一直觉是"嘿,这是一种异步方法,我必须等待。 它",但我也不能这样做,因为显然异步 void 是不同的 从异步任务。
你可以说async Task MyMethod()
.然后,您可以等待其结果传播异常(并等待完成(。
另请观察Stephen Cleary的回答以获取更多详细信息。