-1
我正在编写一个UI应用程序。如果发生一些异常,我需要在退出应用程序之前做一些工作。 所以我订阅了AppDomain.CurrentDomain.UnhandledException
事件。等待从UI线程退出应用程序的异步任务
AppDomain.CurrentDomain.UnhandledException += HandleException;
HandleException
方法执行异步保存到远程(因为没有同步API)。
private void HandleException(object sender, UnhandledExceptionEventArgs args)
{
foreach (var user in UsersCollection.ToArray())
{
try
{
foreach (var session in user.Sessions.ToArray())
{
try
{
SaveSessionAsync(session).Wait();
}
catch (Exception e)
{
Logger.Error("Can't save session: " + session, e);
}
}
}
catch (Exception e)
{
Logger.Error("Can't save sessions of user " + user, e);
}
}
}
应用程序退出之前,我要肯定的是我救了所有会话(试过,至少)。但是如果我把Wait()
放在那里,我会陷入僵局,应用程序永远不会停止。 据我所知,await
可以帮助我在正常情况下(当我在UI线程,但不是在应用程序终止状态),但await
不等待退出应用程序。所以我的保存任务可能会中止。但我需要他们完成。
有没有办法等待SaveSessionAsync
任务的保证完成而不会造成死锁?
BTW:SaveSessionAsync有内部
没有好的[MCVE]可靠地再现了问题,这是不可能知道一个好问题的答案会是什么。但是,一般而言,'UnhandledException'事件本身不存在异常处理。它起到与终结器相似的作用,即作为对多出错代码的支持。您应该在'try' /'catch'块内等待异步操作,以便异常_isn't_未处理。然后你可以在那里的'catch'子句中进行清理工作。 –