当前位置: 首页 > 知识库问答 >
问题:

如何为便携HttpClient实现进度报告

陆啸
2023-03-14

共有1个答案

呼延光明
2023-03-14

我编写了以下代码来实现进度报告。代码支持我想要的所有平台;但是,您需要引用以下NuGet包:

  • Microsoft.net.http
  • Microsoft.bcl.Async

代码如下:

public async Task DownloadFileAsync(string url, IProgress<double> progress, CancellationToken token)
{
    var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token);

    if (!response.IsSuccessStatusCode)
    {
        throw new Exception(string.Format("The request returned with HTTP status code {0}", response.StatusCode));
    }

    var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L;
    var canReportProgress = total != -1 && progress != null;

    using (var stream = await response.Content.ReadAsStreamAsync())
    {
        var totalRead = 0L;
        var buffer = new byte[4096];
        var isMoreToRead = true;

        do
        {
            token.ThrowIfCancellationRequested();

            var read = await stream.ReadAsync(buffer, 0, buffer.Length, token);

            if (read == 0)
            {
                isMoreToRead = false;
            }
            else
            {
                var data = new byte[read];
                buffer.ToList().CopyTo(0, data, 0, read);

                // TODO: put here the code to write the file to disk

                totalRead += read;

                if (canReportProgress)
                {
                    progress.Report((totalRead * 1d) / (total * 1d) * 100);
                }
            }
        } while (isMoreToRead);
    }
}
var progress = new Microsoft.Progress<double>();
progress.ProgressChanged += (sender, value) => System.Console.Write("\r%{0:N0}", value);

var cancellationToken = new CancellationTokenSource();

await DownloadFileAsync("http://www.dotpdn.com/files/Paint.NET.3.5.11.Install.zip", progress, cancellationToken.Token);
 类似资料:
  • 可移植性是任何编程语言的重要方面。 众所周知,Rexx可用于各种操作系统,如Windows和Linux。 因此,需要确保在Windows平台上开发程序时,如果在Linux平台上运行相同的程序,则需要采取必要的预防措施。 Rexx能够运行系统级命令。 有些命令可用于了解运行它的操作系统是什么。 根据输出,它可以采取适当的操作来查看可以在此操作系统上运行的命令。 例子 (Example) 以下示例显示

  • 也许有人可以帮助Windows、Python、Selenium和使用Chrome webdriver与ChromePortable。 我定义了一个新文件夹 你知道吗?提前谢谢你,祝你一天愉快安德烈亚斯

  • 本文向大家介绍sed便携使用,包括了sed便携使用的使用技巧和注意事项,需要的朋友参考一下 示例 就地编辑虽然很常见,但却是一种非标准功能。一个可行的替代方法是使用中间文件来存储原始文件或输出。 要将-i选项与GNU和FreeBSD语法一起使用,必须指定扩展名并将其附加到-i选项中。两者都将接受以下内容,并产生两个文件:的原始版本file.orig和的编辑版本file: 请参阅给定文件的基本示例f

  • 是否有一种可移植的方法来实现C/C中的标记指针,比如一些跨平台和编译器工作的有文档记录的宏?或者,当你标记你的指针时,你就有危险了?如果存在这样的助手函数/宏,它们是任何标准的一部分还是仅作为开源库提供? 对于那些不知道标记指针是什么但感兴趣的人来说,这是一种在普通指针中存储一些额外数据的方法,因为在大多数体系结构中,指针中的某些位总是0或1,所以您将标记/类型/提示保留在这些额外位中,在你们想用

  • 我正在运行一个示例管道,我的环境就是这样。 Python"SaiResearch-Apache-Beam-Spark.py"--run=PortableRunner--job_endpoint=192.168.99.102:8099 我的Spark运行在Docker容器上,我可以看到JobService运行在8099。 我得到以下错误:grpc_频道_多线程登录: 当我卷曲到ip: port时,我