我正在编写一个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答案 0 :(得分:4)
您只使用了在非async
方法中运行它所需的部分语法。使用Task.Run()
将以异步方式运行它,而不必使用await
。
试试这个:
Task.Run(() => SaveSessionAsync(session)).Wait();