gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:28:54 26 4
gpt4 key购买 nike

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

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

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

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

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

是否无法在 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())。不要在异步方法上同步等待,因为 can cause deadlocks .

关于c# - 不会等待从 UnhandledException 处理程序调用的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59216548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com