ホームページ >バックエンド開発 >C++ >.NET で HttpClient を使用してプログレス バーを実装するにはどうすればよいですか?

.NET で HttpClient を使用してプログレス バーを実装するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-12 18:57:43778ブラウズ

How to Implement a Progress Bar with HttpClient in .NET?

HttpClient を使用して .NET にプログレス バーを実装する

.NET 4.5 で導入された IProgress<T> インターフェイスでは、非同期の進行状況レポートの処理が可能になり、HttpClient を使用してファイルをダウンロードするための進行状況バー機能が実装されます。

IProgress<T>

を使用した拡張メソッド

パラメータとして DownloadAsync 実装を受け入れる HttpClient の IProgress<float> オペレーションの拡張メソッドを作成します。この実装により、進行状況バーまたは UI がダウンロード ステータスで更新されます。

<code class="language-csharp">public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress<float> progress = null, CancellationToken cancellationToken = default)
{
    // 首先获取 http 头信息以检查内容长度
    using (var response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead))
    {
        var contentLength = response.Content.Headers.ContentLength;

        using (var download = await response.Content.ReadAsStreamAsync(cancellationToken))
        {
            // 未传递进度报告器或内容长度未知时忽略进度报告
            if (progress == null || !contentLength.HasValue)
            {
                await download.CopyToAsync(destination);
                return;
            }

            // 将绝对进度(已下载字节数)转换为相对进度(0% - 100%)
            var relativeProgress = new Progress<long>(totalBytes => progress.Report((float)totalBytes / contentLength.Value));
            // 使用扩展方法在下载时报告进度
            await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken);
            progress.Report(1); // 报告100%完成
        }
    }
}</code>

このメソッドでは、progress.Report() メソッドが現在のダウンロードの進行状況 (パーセント単位) を IProgress<float> 実装に渡し、それに応じて進行状況バーやその他の UI 要素を更新できるようにします。

進行状況レポート用のストリーム拡張機能

データがターゲット ストリームに書き込まれるときに実際の進行状況レポートを処理するには、Stream クラスの拡張メソッドを作成することを検討してください。

<code class="language-csharp">public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress<long> progress = null, CancellationToken cancellationToken = default)
{
    if (source == null)
        throw new ArgumentNullException(nameof(source));
    if (!source.CanRead)
        throw new ArgumentException("必须可读", nameof(source));
    if (destination == null)
        throw new ArgumentNullException(nameof(destination));
    if (!destination.CanWrite)
        throw new ArgumentException("必须可写", nameof(destination));
    if (bufferSize < 0)
        throw new ArgumentOutOfRangeException(nameof(bufferSize));

    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>

この拡張メソッドは、ターゲット ストリームに書き込まれたバイト数を監視し、渡された IProgress<long> 実装を使用して進行状況を報告します。

これらの拡張メソッドを組み合わせることで、HttpClient を使用したファイル ダウンロード操作のプログレス バー機能を簡単に実装できます。

以上が.NET で HttpClient を使用してプログレス バーを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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