Действительно ли WebClient.DownloadFileAsync такой медленный? - PullRequest
7 голосов
/ 04 июня 2010

Я использую DownloadFileAsync метод WebClient для загрузки некоторых файлов с сервера, и я не могу не заметить, что при неформальном тестировании моего кода в VS2010 он блокируется примерно на 3 секунды, пока это начинается, что, на мой взгляд, своего рода побеждает цель в первую очередь.

Вот соответствующий фрагмент кода:

WebClient downloader = new WebClient();
downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(updateDownloadProgress);
downloader.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(downloadCompleted);

var current_map = map_downloads[0];//string with filename, map_downloads is List<string>

var path = System.IO.Path.GetTempFileName();

downloaded_maps.Add(path);//adding the temp file to a List<string>

downloader.DownloadFileAsync(new Uri(MAP_BASE + current_map), path); //MAP_BASE is a string containing the base url

Я использую DownloadFileAsync, чтобы не блокировать пользовательский интерфейс, пока приложение загружает файл размером ~ 100 МБ. Очевидно, что если пользовательский интерфейс блокируется на 3 секунды во время вызова, это несколько снижает полезность, если не полностью.

Я относительно неопытен в C # /. Net (3-4 года назад я делал кучу вещей .Net 2.0, IIRC, но сейчас я в основном переучиваю его).

Ответы [ 4 ]

8 голосов
/ 26 сентября 2010

В дополнение к тому, что говорит Nav, похоже, проблема в автоопределении веб-прокси , см. Ответ: Почему этот код WebRequest работает медленно?

Я проверил его, и теперь он работает без каких-либо значительных задержек во время первого вызова.

7 голосов
/ 25 июня 2010

Я где-то читал, что DownloadFileAsync фактически проверяет DNS-имя в блокирующем потоке, поэтому, возможно, вы получаете замедление. Если вы введете IP-адрес напрямую, блокировки не должно быть. Нашел эту информацию здесь: http://www.csharp -examples.net / download-files /

0 голосов
/ 28 августа 2011

в ASP.NET использование асинхронного метода не имеет смысла, если от метода aysnc ожидается thread роль.
Когда я запускаю асинхронный веб-клиент, он всегда включается по окончании основного потока (до рендеринга aspx).

отлично статья по теме: http://weblogs.asp.net/gunnarpeipman/archive/2010/09/07/making-asynchronous-calls-to-web-services-during-asp-net-page-processing.aspx

enter image description here

вот другая информация об этом: Асинхронный обратный вызов WebClient не вызывается в ASP.NET MVC

0 голосов
/ 17 июня 2010

Вы выяснили, есть ли задержка в вашем приложении или в сети? Чтобы узнать, медленен ли сервер назначения, запустите Wireshark и посмотрите, когда будет получен первый ответ после отправки запроса. Может быть, именно здесь происходит задержка?

Кроме того, если это часть большого приложения, то первое время всегда будет медленным из-за затрат на запуск. Если вы действительно хотите получить хорошее измерение, измерьте общее время, необходимое для 1-го вызова и от 2-го до 10-го вызова. Отсюда вы можете узнать, в каких случаях задержка - в затратах на запуск или каждый раз.

...