我的部分流程有时会压缩文件,而我正试图使该流程异步。我对此很陌生。
我之前使用过“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};
}
答案 0 :(得分:1)
我怀疑你的调用堆栈中的代码正在调用Task.Wait
或Task<T>.Result
,这就是问题所在。
如果您正在使用UI或ASP.NET请求线程进行处理,然后阻止异步任务,那么我在我的博客上描述了run the risk of a deadlock。默认情况下,await
将捕获当前“上下文”(例如,UI上下文)并在该上下文中恢复async
方法(例如,在UI线程上)。如果您阻止该上下文(例如,通过在UI线程上调用Task.Wait
或Task<T>.Result
),则async
方法无法继续执行,并且无法完成该任务。