【发布时间】:2019-02-06 23:50:06
【问题描述】:
鉴于这段代码,我注意到我的 UI 阻塞了一段时间(Windows 甚至弹出一条消息说应用程序没有响应。
using (var zip = await downloader.DownloadAsZipArchive(downloadUrl))
{
var temp = FileUtils.GetTempDirectoryName();
zip.ExtractToDirectory(temp); // BLOCKING CALL
if (Directory.Exists(folderPath))
{
Directory.Delete(folderPath, true);
}
var firstChild = Path.Combine(temp, folderName);
Directory.Move(firstChild, folderPath);
Directory.Delete(temp);
}
经过一番检查,我发现上面写着:
zip.ExtractToDirectory(temp);
是罪魁祸首。
我认为把它变成就足以让它发挥作用:
await Task.Run(() => zip.ExtractToDirectory(temp));
但是……这是解决这个问题的好方法吗?
我有 System.Reactive 的背景(我完全从事反应式编程),我想知道是否有更优雅的方式来处理这个问题。
【问题讨论】:
-
如果同步调用被阻塞,则使其异步。这几乎是唯一的答案。
-
ZipFile.ExtractToDirectory 不是异步的,我无法使其异步,因为它不是我的,而是 .NET Framework 的一部分:(
-
不像将
async放在它前面那样“异步”。与“异步”中的异步一样,就像从 UI 线程中获取它一样。这是否意味着将其放入Task、Thread、BackgroundWorker,或者任何通常没有一个正确答案的实现细节。 -
如果你完全使用 Rx,你就不会到处都有 TPL 和异步。将两者结合起来通常比它的价值更痛苦。
-
@SuperJMN - 使用 Rx 执行此操作有什么问题?
标签: c# .net async-await system.reactive