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