异步下载和解压缩文件
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
的任何异步实现。
到目前为止,这是我的代码:
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
的任何异步实现。