この記事では、HttpClient を使用してファイルのダウンロード時に進行状況バーを実装する方法について説明します。証明書処理の制限により DownloadOperation は使用できないため、別のアプローチが必要です。
.Net 4.5 以降、IProgress
// HttpClient をセットアップする using (var client = new HttpClient()) {
<code class="language-csharp">// 带进度报告的文件下载 await client.DownloadAsync(DownloadUrl, file, progress, cancellationToken);</code>
}
DownloadAsync 拡張メソッドは、進行状況レポートを伴うストリーム レプリケーションの別の拡張メソッドに依存します:
<code class="language-csharp">public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress<float> progress = null, CancellationToken cancellationToken = default) { // 获取内容长度的标头 using (var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead)) { // 如果不支持,则忽略进度报告 if (progress == null || !response.Content.Headers.ContentLength.HasValue) { await response.Content.ReadAsStreamAsync(cancellationToken).CopyToAsync(destination); return; } // 计算相对进度 var relativeProgress = new Progress<long>(totalBytes => progress.Report((float)totalBytes / response.Content.Headers.ContentLength.Value)); // 带进度报告的下载 await response.Content.ReadAsStreamAsync().CopyToAsync(destination, 81920, relativeProgress, cancellationToken); progress.Report(1); } } public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long> progress = null, CancellationToken cancellationToken = default) { var buffer = new byte[bufferSize]; long totalBytesRead = 0; int bytesRead; while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken).ConfigureAwait(false)) != 0) { await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false); totalBytesRead += bytesRead; progress?.Report(totalBytesRead); } }</code>
<code> 通过以上代码,开发者可以轻松地在使用HttpClient下载文件的同时,实现进度条功能,提升用户体验。 需要注意的是,`CopyToAsync` 方法中的 `bufferSize` 参数可以根据实际情况调整,以平衡性能和内存消耗。</code>
以上がファイルのダウンロード中に HttpClient で進行状況バーを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。