-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有內部

+0

沒有好的[MCVE]可靠地再現了問題,這是不可能知道一個好問題的答案會是什麼。但是,一般而言,'UnhandledException'事件本身不存在異常處理。它起到與終結器相似的作用,即作爲對多出錯代碼的支持。您應該在'try' /'catch'塊內等待異步操作,以便異常_isn't_未處理。然後你可以在那裏的'catch'子句中進行清理工作。 –

回答

2

你只使用你需要在非async方法運行它的語法的一部分Parse.com API。利用Task.Run()將以異步方式運行它,而不必使用await

試試這個:

Task.Run(() => SaveSessionAsync(session)).Wait();