ホームページ >バックエンド開発 >C++ >ファイルのダウンロード中に HttpClient で進行状況バーを実装するにはどうすればよいですか?

ファイルのダウンロード中に HttpClient で進行状況バーを実装するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 18:46:41531ブラウズ

How to Implement a Progress Bar with HttpClient During File Downloads?

HttpClient を使用してファイルをダウンロードするときに進行状況バーを実装します

はじめに

この記事では、HttpClient を使用してファイルのダウンロード時に進行状況バーを実装する方法について説明します。証明書処理の制限により DownloadOperation は使用できないため、別のアプローチが必要です。

IProgress を使用する

.Net 4.5 以降、IProgress では非同期の進行状況レポートが可能になります。ファイルのダウンロードのために HttpClient と統合する方法の例を次に示します:

// 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。