使用Task.Run()异步压缩阻止UI。我错过了什么?

时间:2014-03-01 07:03:48

标签: c# asynchronous zip

我的部分流程有时会压缩文件,而我正试图使该流程异步。我对此很陌生。

我之前使用过“await Task.Run(()=> DoSomething())”并没有遇到任何问题。出于某种原因,当我的程序到达等待的Task.Run()时,它会无限期地挂起。

有人会让我知道我错过了什么吗?提前谢谢。

public static async Task<BackupResultHelper> BackupAndZip(List<MyBackupItem> itemList, FileInfo targetFi) {
        DirectoryInfo zipSourceDi = new DirectoryInfo(targetFi.Directory + "\\Temp");

        if (targetFi.Exists)
            targetFi.Delete();

        if (!Directory.Exists(zipSourceDi.FullName))
            Directory.CreateDirectory(zipSourceDi.FullName);

        foreach (MyBackupItem item in itemList) {
            DirectoryInfo dir = new DirectoryInfo(zipSourceDi.FullName + "\\" + item.Name);
            if (!BackupItem(item, dir.FullName)) return ErrorResultHelper;
        }

        await Task.Run(() => ZipFile.CreateFromDirectory(zipSourceDi.FullName, targetFi.FullName, CompressionLevel.Optimal, false));

        Directory.Delete(zipSourceDi.FullName, true);
        string time = DateTime.Now.ToLongTimeString();
        return new BackupResultHelper(){Success = true, Message = "Backup complete!", BackupDateTime = time};
    }

1 个答案:

答案 0 :(得分:1)

我怀疑你的调用堆栈中的代码正在调用Task.WaitTask<T>.Result,这就是问题所在。

如果您正在使用UI或ASP.NET请求线程进行处理,然后阻止异步任务,那么我在我的博客上描述了run the risk of a deadlock。默认情况下,await将捕获当前“上下文”(例如,UI上下文)并在该上下文中恢复async方法(例如,在UI线程上)。如果您阻止该上下文(例如,通过在UI线程上调用Task.WaitTask<T>.Result),则async方法无法继续执行,并且无法完成该任务。