等待应用程序从UI线程退出异步任务

本文关键字:退出 异步 任务 线程 UI 应用程序 等待 | 更新日期: 2023-09-27 18:09:19

我正在编写一个UI应用程序。如果发生一些异常,我需要在应用程序退出之前做一些工作。所以我订阅了AppDomain.CurrentDomain.UnhandledException事件

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内部有Parse.com API

等待应用程序从UI线程退出异步任务

您只使用了在非async方法中运行它所需的部分语法。使用Task.Run()将以异步方式运行它,而不必使用await

试试这个:

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