繁体   English   中英

不等待从 UnhandledException 处理程序调用的异步方法

[英]Async methods called from UnhandledException handler don't get awaited

在我的App.xaml.cs ,我创建了一个用于响应AppDomain.CurrentDomain.UnhandledException事件的处理程序。

在处理程序内部,我需要调用一个异步方法,该方法发送有关错误的电子邮件报告。 所以我在等待这个方法,在它里面我在等待Net.Mail.SmtpClient.SendMailAsync()

但这不起作用——当控件到达第二个等待(就在实际发送之前)时,应用程序退出。

当我摆脱所有异步并使用同步替代方案Net.Mail.SmtpClient.Send() 时,电子邮件会正确发送。

似乎在处理程序中没有抛出其他异常。 此外,它似乎不仅仅是 Visual Studio 调试模式问题。

是否不可能在 UnhandledException 处理程序中成功调用异步方法?

更新:

我的处理程序方法的签名如下所示:

private async void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e);

我将处理程序附加到App的构造函数中的事件,如下所示:

App()
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}

事件总是void 这意味着如果你想使用await ,你必须使用async void 这就是你在这里看到的问题的原因。

await作用于未完成的Task ,该方法的其余部分将在等待后安排完成,并返回 通常它返回一个调用者可以等待的Task ,但由于返回类型是void ,它不返回任何内容。 调用者不能等待它,即使它想要。 通常这不是事件的问题,因为事件只是“某事”发生的通知,触发事件的任何事情都不依赖于事件处理程序内部发生的任何事情。

但在这种情况下,框架会在事件处理程序返回后关闭应用程序。 因此,由于await返回,应用程序将关闭而不等待任务实际完成。

您最好的解决方案是在您的事件处理程序中保持所有内容同步。 这将防止它在您预期之前返回。

“保持一切同步”,我的意思是实际使用同步方法(如Net.Mail.SmtpClient.Send() )。 不要在异步方法上同步等待,因为这会导致死锁

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM