【问题标题】:C# WebClient DownloadProgressChanged won't work properlyC# WebClient DownloadProgressChanged 无法正常工作
【发布时间】:2011-06-26 01:38:45
【问题描述】:

我正在尝试使用 C# 从 Internet 下载文件 通过使用 WebClient 对象的 DownloadDataAsync 方法。

我也想通过webclient对象的DownloadProgressChanged事件来获取下载进度。

问题是,BytesReceived 和 TotalBytesToReceive 属性都没有显示正确的值。当我在调试时尝试检查它们时,它们都以不可重现的方式发生变化。

我的代码:

WebClient client = new WebClient();
        client.BaseAddress = this.DownloadUrl;
        client.DownloadProgressChanged += downloadProgressDelegate;
        client.DownloadDataAsync(new System.Uri(this.DownloadUrl));

【问题讨论】:

  • 你下载的是什么文件?您能否在带宽有限的情况下尝试本地 IIS 中的大文件,以提供可重现的测试环境?

标签: c# .net file download webclient


【解决方案1】:

您应该简单地“等待”它。即:

await client.DownloadDataAsync(new System.Uri(uri));

请不要忘记将您的方法转换为“异步任务”、异步任务或异步无效。否则,如果您不想更改方法签名,也可以执行以下操作:

client.DownloadDataAsync(new System.Uri(uri)).Wait();

上述两种方法各有优缺点,您可以选择哪一种。

【讨论】:

    【解决方案2】:

    有类似问题,在DownloadDataAsync之后尝试:

    while (client.IsBusy) { Application.DoEvents(); }
    

    【讨论】:

    【解决方案3】:

    我刚刚在 LINQPad 中尝试了以下代码:

    var uri = @"http://download.services.openoffice.org/files/stable/3.3.0/OOo_3.3.0_Win_x86_install-wJRE_en-US.exe";
    
    WebClient client = new WebClient();
    client.DownloadProgressChanged += (sender, e) =>
      {
        Console.WriteLine("Bytes: " + e.BytesReceived + " of " + e.TotalBytesToReceive);
      };
    
    client.DownloadDataAsync(new System.Uri(uri));
    
    Thread.Sleep(4000);
    client.CancelAsync();
    

    ...得到以下结果:

    字节:158067944 中的 4138 字节:158067944 中的 50858 字节:158067944 中的 68378 字节:158067944 中的 134078 字节:158067944 中的 133914 ......

    似乎有效。

    编辑:也许你的 HTTP 服务器没有正确地 return the size,但我没有一个 URI 来测试这个服务器行为与 WebClient 实现的对比。

    【讨论】:

    • 会不会取决于正在下载的文件?
    猜你喜欢
    • 2013-08-26
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2020-08-01
    • 2010-11-29
    • 2015-02-04
    相关资源
    最近更新 更多