Действительно ли WebClient.DownloadFileAsync такой медленный?
Я использую 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 (я делал кучу вещей.Net 2.0 3-4 года назад, IIRC, но сейчас я в основном переучиваю его).
4 ответа
В дополнение к тому, что говорит Nav, похоже, что проблема в автоопределении веб-прокси, см. Ответ: почему этот код WebRequest работает медленно?
Я проверил его, и теперь он работает без каких-либо значительных задержек во время первого звонка.
Я где-то читал, что DownloadFileAsync фактически проверяет DNS-имя в блокирующем потоке, поэтому, возможно, вы получаете замедление. Если вы введете IP-адрес напрямую, блокировки не должно быть. Нашел эту информацию здесь: http://www.csharp-examples.net/download-files/
Вы выяснили, есть ли задержка в вашем приложении или в сети? Чтобы выяснить, медленен ли сервер назначения, запустите Wireshark и посмотрите, когда будет получен первый ответ после отправки запроса. Может быть, именно здесь происходит задержка?
Кроме того, если это часть большого приложения, то первое время всегда будет медленным из-за затрат на запуск. Если вы действительно хотите получить хорошее измерение, измерьте общее время, необходимое для 1-го вызова и от 2-го до 10-го вызова. Из этого вы можете узнать, является ли задержка затратами на запуск или каждый раз.
В ASP.NET использование асинхронного метода не имеет смысла, если от метода aysnc ожидается роль потока.
Когда я запускаю асинхронный веб-клиент, он всегда включается по окончании основного потока (перед рендерингом aspx).
отличная статья о теме: http://weblogs.asp.net/gunnarpeipman/archive/2010/09/07/making-asynchronous-calls-to-web-services-during-asp-net-page-processing.aspx
Вот другая информация об этом: асинхронный обратный вызов WebClient не вызывается в ASP.NET MVC