异步下载和解压缩文件

Download and unzip file asynchronically

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

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 异步就好了

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

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

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

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

.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 的任何异步实现。