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

时间:2016-09-27 21:20:44

标签: c# multithreading asynchronous parse-platform task-parallel-library

我正在编写一个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

1 个答案:

答案 0 :(得分:4)

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

试试这个:

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