Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melaksanakan Bar Kemajuan dengan HttpClient Semasa Muat Turun Fail?
Artikel ini menerangkan cara menggunakan HttpClient untuk melaksanakan bar kemajuan semasa memuat turun fail. Memandangkan DownloadOperation tidak boleh digunakan kerana had pengendalian sijil, pendekatan lain diperlukan.
Bermula dalam .Net 4.5, IProgress
// Sediakan HttpClient menggunakan (var client = new HttpClient()) {
<code class="language-csharp">// 带进度报告的文件下载 await client.DownloadAsync(DownloadUrl, file, progress, cancellationToken);</code>
}
Kaedah sambungan DownloadAsync bergantung pada kaedah sambungan lain untuk replikasi strim dengan pelaporan kemajuan:
<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>
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Bar Kemajuan dengan HttpClient Semasa Muat Turun Fail?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!