2010-06-04 10 views
7

Estoy usando el método DownloadFileAsync de WebClient para descargar algunos archivos de un servidor, y no puedo dejar de notar que en mis pruebas informales de mi código dentro de VS2010, bloquea durante aproximadamente 3 segundos mientras se inicia, lo que en mi opinión, es una especie de fracaso en primer lugar.¿Es realmente lento este WebClient.DownloadFileAsync?

Aquí es el fragmento correspondiente de código:

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 

estoy usando DownloadFileAsync para mantener la interfaz de usuario de bloqueo mientras la aplicación se descarga un archivo de MB ~ 100. Obviamente, si la UI bloquea durante 3 segundos mientras se inicia la llamada, eso disminuye algo la utilidad, si no del todo.

Tengo relativamente poca experiencia con C#/.Net (hice un montón de cosas de .Net 2.0 hace unos 3-4 años, IIRC, pero básicamente estoy volviéndolo a aprender ahora).

Respuesta

0

¿Has descubierto si la demora está en tu aplicación o en la red? Para saber si el servidor de destino es lento, ejecute Wireshark y vea cuándo se recibe la primera respuesta después de enviar la solicitud. Quizás es allí donde ocurre el retraso?

Además, si esto es parte de una gran aplicación, entonces la primera vez siempre será lenta debido a los costos de inicio. Si realmente desea obtener una buena medición, mida el tiempo total requerido para la primera invocación y para la segunda a la décima invocación. De esto puede averiguar si la demora está en los costos de inicio, o siempre.

7

Leí en alguna parte que DownloadFileAsync en realidad comprueba el nombre DNS en un hilo de bloqueo, por lo tanto, es posible que esté recibiendo la ralentización. Si ingresas la IP directamente, no debería haber ningún bloqueo. Encontrado ese pedazo de información aquí: http://www.csharp-examples.net/download-files/

8

Además de lo que dice Nav, parece que el problema es web proxy de detección automática, ver esta respuesta: Why is this WebRequest code slow?

lo probé y ahora funciona sin ningún significativa demora durante la primera llamada.

+0

Gracias, que funcionó a la perfección! Para aquellos que experimentan el mismo problema, simplemente configure la propiedad 'Proxy' del webclient en null antes de llamar a la descarga. – Zoey

Cuestiones relacionadas