2010-06-04 3 views
7

J'utilise la méthode DownloadFileAsync de WebClient pour télécharger des fichiers à partir d'un serveur, et je ne peux m'empêcher de remarquer que dans mes tests informels de mon code dans VS2010, il bloque pendant environ 3 secondes au démarrage, ce qui, à mon avis, en quelque sorte défait le but en premier lieu.Est-ce que WebClient.DownloadFileAsync est vraiment lent?

Voici l'extrait pertinent du code:

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 

J'utilise DownloadFileAsync pour maintenir l'interface utilisateur de bloquer pendant que l'application télécharge un fichier ~ 100 Mo. Évidemment, si l'interface utilisateur bloque pendant 3 secondes pendant que l'appel commence, cela diminue quelque peu l'utilité, sinon complètement. Je suis relativement inexpérimenté avec C# /. Net (j'ai fait un tas de choses .Net 2.0 il y a environ 3 ou 4 ans, IIRC, mais je le réapprends tout de suite).

Répondre

0

Avez-vous déterminé si le retard est dans votre application ou sur le réseau? Pour savoir si le serveur de destination est lent, exécutez Wireshark et voyez quand la première réponse est reçue après l'envoi de la requête. Peut-être que c'est là que le retard se produit?

De plus, si cela fait partie d'une grande application, la première fois sera toujours lente en raison des coûts de démarrage. Si vous voulez vraiment obtenir une bonne mesure, mesurez le temps total requis pour la 1ère invocation, et pour la 2ème à la 10ème invocation. De cela, vous pouvez savoir si le retard est dans les coûts de démarrage, ou à chaque fois.

7

J'ai lu quelque part que DownloadFileAsync vérifie réellement le nom DNS dans un thread bloquant, d'où le ralentissement. Si vous mettez l'IP directement, il ne devrait pas y avoir de blocage. Trouvé cette information en ici: http://www.csharp-examples.net/download-files/

8

En plus de ce que Nav dit, il semble que le problème est proxy web autodetection, voir cette réponse: Why is this WebRequest code slow?

Je l'ai testé et il fonctionne maintenant sans significatif retarder pendant le premier appel.

+0

Merci, ça a parfaitement fonctionné! Pour ceux qui rencontrent le même problème, définissez la propriété 'Proxy' de l'internaute sur null avant d'appeler le téléchargement. – Zoey

-1

dans ASP.NET, en utilisant la méthode async n'a aucune signification si thread rôle attendu de la méthode aysnc.
Lorsque je lance webclient async, il se connecte toujours à la fin du thread principal (avant le rendu d'aspx).

grand article sur le sujet: 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

ici sont d'autres informations à ce sujet: WebClient async callback not called in ASP.NET MVC

Questions connexes