到目前为止,这是我的代码:
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
。
为了能够查看部分下载的文件的内容,需要编写自己的解压缩程序。