2010-06-04 18 views
7

Sto utilizzando il metodo DownloadFileAsync di WebClient per scaricare alcuni file da un server e non posso fare a meno di notare che nei miei test informali del mio codice in VS2010, esso blocca per circa 3 secondi durante l'avvio, che, a mio parere, tipo di sconfitte lo scopo in primo luogo.WebClient.DownloadFileAsync è davvero lento?

Ecco il relativo frammento di codice:

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 

sto usando DownloadFileAsync per mantenere l'interfaccia utente di bloccare mentre l'applicazione scarica un file ~ 100 MB. Ovviamente se l'UI blocca per 3 secondi mentre inizia la chiamata, ciò diminuisce un po 'l'utilità, se non interamente.

Sono relativamente inesperto con C# /. Net (ho fatto un sacco di cose di .Net 2.0 circa 3-4 anni fa, IIRC, ma fondamentalmente sto riappacificandolo ora).

risposta

0

Hai capito se il ritardo è nell'app o sulla rete? Per scoprire se il server di destinazione è lento, eseguire Wireshark e vedere quando viene ricevuta la prima risposta dopo l'invio della richiesta. Forse è qui che si verifica il ritardo?

Inoltre, se questo fa parte di una grande applicazione, la prima volta sarà sempre lenta a causa dei costi di avvio. Se vuoi davvero ottenere una buona misurazione, misura il tempo totale necessario per la prima chiamata e per la seconda e la decima invocazione. Da questo è possibile scoprire se il ritardo è nei costi di avvio, o ogni volta.

7

Ho letto da qualche parte che DownloadFileAsync controlla effettivamente il nome DNS in un thread di blocco, quindi perché si può ottenere il rallentamento. Se inserisci direttamente l'IP, non dovrebbe esserci alcun blocco. Trovato quel pezzo di informazioni qui: http://www.csharp-examples.net/download-files/

8

In aggiunta a quanto dice Nav, sembra che il problema è proxy web rilevamento automatico, vedere questa risposta: Why is this WebRequest code slow?

ho provato e ora funziona senza alcun significativo ritardo durante la prima chiamata.

+0

Grazie, che ha funzionato perfettamente! Per coloro che hanno lo stesso problema, è sufficiente impostare la proprietà "Proxy" del client Web su null prima di chiamare il download. – Zoey