异步下载和解压缩文件



到目前为止,这是我的代码:

async Task<bool> HttpDownloadAndUnzip(string requestUri, string directoryToUnzip) 
{
using var response = await new HttpClient().GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead);
if (!response.IsSuccessStatusCode) return false;
using var streamToReadFrom = await response.Content.ReadAsStreamAsync();
using var zip = new ZipArchive(streamToReadFrom); // Blocks! 
zip.ExtractToDirectory(directoryToUnzip);
return true;
}

我看到的调试器跟踪是ZipArchive构造函数阻塞,直到从URI下载整个文件

这使得大部分操作是同步的,而我希望下载和解压缩都是异步的。

这里的解决方案是什么?如何使解压缩异步?

PS最好有ExtractToDirectory异步以及

.NET中的ZipArchive支持只有一些非常基本的异步支持。

您可以异步地将流下载到内存中(通过删除HttpCompletionOption.ResponseHeadersRead(,然后进行解压缩:

async Task<bool> HttpDownloadAndUnzip(string requestUri, string directoryToUnzip) 
{
using var response = await new HttpClient().GetAsync(requestUri);
if (!response.IsSuccessStatusCode) return false;
using var streamToReadFrom = await response.Content.ReadAsStreamAsync();
using var zip = new ZipArchive(streamToReadFrom);
zip.ExtractToDirectory(directoryToUnzip);
return true;
}

我不知道BCL或任何.NET库中有任何ExtractToDirectory的异步实现。

最简单的解决方案是将您的阻塞代码封装在中

await Task.Run(() =>
{
// blocking code goes here
});

它仍将等待整个文件下载后才能查看,但它将是async

为了能够查看部分下载的文件的内容,需要编写自己的解压缩程序。

最新更新