C# WebClient DownloadProgressChanged无法正常工作

6

我正在尝试使用C#中的WebClient对象的DownloadDataAsync方法从互联网下载文件。

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

问题是,无论是BytesReceived属性还是TotalBytesToReceive属性都没有显示正确的值。当我在调试时尝试检查它们时,它们都以不可复制的方式改变。

我的代码:

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

1
你正在下载哪个文件?您可以尝试从本地IIS下载一个大文件,并限制带宽以提供可重复的测试环境吗? - Greg B
3个回答

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();

...并得到以下结果:

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

看起来工作正常。

编辑:也许您的HTTP服务器没有正确地返回大小,但我没有一个URI可以测试此服务器行为与WebClient实现相对应。


这可能取决于正在下载的文件吗? - Robert Harb

1

我遇到了类似的问题,在DownloadDataAsync之后尝试以下操作:

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

使用 Application.DoEvents() 是一个不好的主意。https://dev59.com/22435IYBdhLWcg3w1z0t - Mark

-1
你应该简单地使用 "await"。例如:
await client.DownloadDataAsync(new System.Uri(uri));

请不要忘记将您的方法转换为“async Task”,异步任务或异步 void。否则,如果您不想在方法签名中进行更改,也可以执行以下操作:
client.DownloadDataAsync(new System.Uri(uri)).Wait();

以上两种方法各有优缺点,取决于您选择哪一种。


DownloadDataAsync 是一个 void 函数。它是一种旧式的异步函数(您必须订阅事件以获取结果)。 - Shayan Toqraee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接