等待应用程序从UI线程退出异步任务
本文关键字:退出 异步 任务 线程 UI 应用程序 等待 | 更新日期: 2023-09-27 18:09:19
我正在编写一个UI应用程序。如果发生一些异常,我需要在应用程序退出之前做一些工作。所以我订阅了AppDomain.CurrentDomain.UnhandledException
事件
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内部有Parse.com API
您只使用了在非async
方法中运行它所需的部分语法。使用Task.Run()
将以异步方式运行它,而不必使用await
。
试试这个:
Task.Run(() => SaveSessionAsync(session)).Wait();