>백엔드 개발 >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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.