-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();