-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'子句中進行清理工作。 –