如何在 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));
一旦你await
和Task
,你通常不需要做任何其他事情。 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在.net core mvc c#中提取格式.gz/.zip/.rar/.tar.gz