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

Vas*_*zov 0 c# multithreading asynchronous task-parallel-library parse-platform

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

AppDomain.CurrentDomain.UnhandledException += HandleException;
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在应用程序退出之前,我需要确保我保存了所有会话(至少尝试过)。但是如果我把Wait()它放在那里,我就会陷入僵局,应用程序永远不会停止。据我所知,await在正常情况下可能会帮助我(当我处于 UI 线程但不在应用程序终止状态时),但await不会等待应用程序退出。所以我的保存任务可能会中止。但我需要他们完成。

有没有一种方法可以在SaveSessionAsync不造成死锁的情况下等待有保证的任务完成?

顺便说一句:SaveSessionAsync 里面有 Parse.com API

kri*_*gar 5

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

尝试这个:

Task.Run(() => SaveSessionAsync(session)).Wait();
Run Code Online (Sandbox Code Playgroud)