C # WebClient DownloadProgressChanged не будет работать должным образом - PullRequest
6 голосов
/ 12 февраля 2011

Я пытаюсь скачать файл из интернета с помощью C # с помощью метода DownloadDataAsync объекта WebClient.

Я также хочу получить ход загрузки, используя событие DownloadProgressChanged объекта webclient.

Проблема в том, что ни свойства BytesReceived, ни TotalBytesToReceive не отображают правильные значения. Они оба меняются невоспроизводимым образом, когда я пытаюсь проверить их во время отладки.

Мой код:

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

Ответы [ 3 ]

5 голосов
/ 12 февраля 2011

Я только что попробовал следующий код в 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-сервер не правильно возвращает размер , но у меня нет URI для тестирования этого поведения сервера с реализацией WebClient.

1 голос
/ 08 января 2014

С аналогичными проблемами сразу после DownloadDataAsync попробуйте:

while (client.IsBusy) { Application.DoEvents(); }
0 голосов
/ 08 сентября 2016

Вы должны просто "ждать" этого.То есть:

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

Пожалуйста, не забудьте преобразовать свой метод в «асинхронную задачу», асинхронную задачу или асинхронную пустоту.В противном случае, если вы не хотите вносить изменения в сигнатуру вашего метода, вы также можете сделать следующее:

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

Оба вышеуказанных подхода имеют свои преимущества и недостатки, и вы сами выбираете, какой из них.

...