首页 > 后端开发 > C++ > 如何使用HttpClient实现文件下载过程中的进度条?

如何使用HttpClient实现文件下载过程中的进度条?

Mary-Kate Olsen
发布: 2025-01-12 18:46:41
原创
579 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板