C#WebClient DownloadProgressChanged将无法正常工作

时间:2011-02-12 12:20:05

标签: c# .net file download webclient

我正在尝试使用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));

3 个答案:

答案 0 :(得分:5)

我刚在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();

...并得到以下结果:

Bytes: 4138 of 158067944
Bytes: 50858 of 158067944
Bytes: 68378 of 158067944
Bytes: 134078 of 158067944
Bytes: 133914 of 158067944
.....

似乎工作。

编辑:也许您的HTTP服务器没有return the size正确,但我没有URI来测试针对WebClient实现的此服务器行为。

答案 1 :(得分:1)

DownloadDataAsync尝试之后发生了类似的问题:

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

答案 2 :(得分:0)

你应该“等待”它。即:

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

请不要忘记将您的方法转换为“异步任务”,async Task或async void。否则,如果您不想在方法签名中进行更改,您还可以执行以下操作:

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

上述两种方法都有优点和缺点,您可以自行选择其中一种方法。