我正在尝试使用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));
答案 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();
上述两种方法都有优点和缺点,您可以自行选择其中一种方法。