> 백엔드 개발 > C++ > 파일 다운로드 중에 HttpClient로 진행률 표시줄을 구현하는 방법은 무엇입니까?

파일 다운로드 중에 HttpClient로 진행률 표시줄을 구현하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-12 18:46:41
원래의
531명이 탐색했습니다.

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

HttpClient를 사용하여 파일을 다운로드할 때 진행률 표시줄 구현

소개

이 문서에서는 HttpClient를 사용하여 파일을 다운로드할 때 진행률 표시줄을 구현하는 방법을 설명합니다. 인증서 처리 제한으로 인해 DownloadOperation을 사용할 수 없으므로 다른 접근 방식이 필요합니다.

IProgress 사용

.Net 4.5부터 IProgress는 비동기식 진행 보고를 허용합니다. 파일 다운로드를 위해 HttpClient와 통합하는 방법의 예는 다음과 같습니다.

// HttpClient 설정 (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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿