-1

Я пишу приложение для интерфейса. Если произойдет какое-то исключение, мне нужно выполнить некоторую работу перед выходом приложения. Итак, я подписался на событие AppDomain.CurrentDomain.UnhandledException.Ждите задачи async при выходе приложения из потока пользовательского интерфейса

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 может помочь мне в нормальной ситуации (когда я в потоке пользовательского интерфейса, но не в состоянии завершения приложения), но await не ожидает выхода приложения. Поэтому мои задачи сохранения могут быть прерваны. Но мне нужно, чтобы они закончили.

Есть ли способ ждать гарантированного завершения задачи SaveSessionAsync без создания тупика?

КСТАТИ: SaveSessionAsync имеет Parse.com API внутри

+0

Без хорошо [mcve], которая надежно воспроизводит проблему, это невозможно знать, что хороший ответ на этот вопрос будет. Однако, вообще говоря, событие UnhandledException не существует для обработки исключений per se. Он играет аналогичную роль как финализаторы, т. Е. Как обратный багги код. Вы должны ожидать свою асинхронную операцию внутри блока 'try' /' catch', чтобы исключение не было обработано _isn't_. Затем вы можете выполнять свою работу по очистке в разделе 'catch'. –

ответ

2

Вы только использовали часть синтаксиса вам нужно запустить его в не async метода. Использование Task.Run() будет запускать его в асинхронном режиме без использования await.

Попробуйте это:

Task.Run(() => SaveSessionAsync(session)).Wait(); 
Смежные вопросы