如何在 C# 中异步提取 zip 文件以不阻塞 UI?

Posted

技术标签:

【中文标题】如何在 C# 中异步提取 zip 文件以不阻塞 UI?【英文标题】:How to extract a zip file Asynchronously in c# to not block the UI? 【发布时间】:2013-07-19 20:22:52 【问题描述】:

C# 中似乎没有可以使用 await 解压缩文件的方法,因此我创建了一个任务并尝试等待它。我收到以下错误:

Cannot implicitly convert type 'void' to 'System.Threading.Tasks.Task'

当我运行这段代码时..

Task taskA = await Task.Run(() => ZipFile.ExtractToDirectory(tempPath + @"\" + ftpFile, pvtdest));

对此的任何想法将不胜感激!谢谢你:)

【问题讨论】:

请记住,通过使用 async 和 await 关键字,它仍将在 UI 线程上运行。使用单独的线程来运行它可能会更好。 @mao47: Task.Run 使用线程池线程。 【参考方案1】:

只需删除Task taskA =,如下所示:

await Task.Run(() => ZipFile.ExtractToDirectory(tempPath + @"\" + ftpFile, pvtdest));

一旦你awaitTask,你通常不需要做任何其他事情。 Task 没有结果值,这就是编译器抱怨“void”的原因。 await 将处理传播异常并在您的 Task.Run 完成时继续该方法,这应该是您所需要的。

【讨论】:

谢谢,我是自学成才的,在编程方面我没有最好的知识,但我觉得我应该知道这一点。它对我有用,再次感谢您。 这与 aysnc 无关,ZipFile.ExtractToDirectory 方法不处理覆盖。它抛出异常,知道如何选择覆盖文件吗? @FaisalHafeez:我建议你问自己的问题。 @AgentFire:由于ZipFile 不提供async API,因此真正的异步答案将有数百或数千行长。随意使用真正的异步等效项添加您自己的答案。 @StephenCleary 好吧,正确的答案是:在这种情况下没有异步解决方案,只有好的旧阻塞解决方案。【参考方案2】:

试试:

Task.Factory.StartNew(() =>

    ZipFile.ExtractToDirectory(tempPath + @"\" + ftpFile, pvtdest)

你应该包括System.Threading.Tasks;

【讨论】:

这个答案不能很好地处理异常。 @AgentFire 您最好在发表评论之前阅读文档。

以上是关于如何在 C# 中异步提取 zip 文件以不阻塞 UI?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 代码中提取 7zip

如何在iOS中解压缩异步方式的zip文件?

如何在.net core mvc c#中提取格式.gz/.zip/.rar/.tar.gz

如何在 C# 中使用 Ionic-zip 下载大文件时修复 zip 文件损坏错误

如何在c#中解压.zip文件而不解压到新位置

C#中如何通过ZipFile类操作ZIP文件(压缩、解压)