2010-06-04 91 views
7

我使用DownloadFileAsync方法WebClient從服務器上下載一些文件,我不禁注意到,在VS2010中對我的代碼進行非正式測試時,它在啓動時會阻塞大約3秒,在我看來,首先是擊敗了目的。WebClient.DownloadFileAsync真的這麼慢嗎?

這裏是代碼中的相關片段:

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從阻止保持UI,而應用程序下載量100〜MB的文件。很明顯,如果UI在通話開始時阻塞3秒,那麼即使不是全部,也會在某種程度上降低實用性。我對C#/ .Net相對缺乏經驗(我在3-4年前做了一堆.Net 2.0的工作,IIRC,但我現在基本上是在重新學習它)。

回答

0

你知道延遲是在你的應用程序還是在網絡上?要確定目標服務器是否運行緩慢,請運行Wireshark並查看發送請求後收到第一個響應的時間。也許這就是延遲發生的地方?另外,如果這是大型應用程序的一部分,那麼由於啓動成本,第一次總是會很慢。如果你真的想要得到一個好的度量,那麼測量第一次調用所需的總時間,以及第二次調用到第十次調用所需的總時間。由此您可以瞭解延遲是否處於啓動成本或每次。

7

我在某處看到DownloadFileAsync實際上在阻塞線程中檢查DNS名稱,因此您可能會遇到放緩的情況。如果您直接將IP置入,則不應阻塞。研究發現,一塊信息在這裏:http://www.csharp-examples.net/download-files/

8

除了什麼導航說,它看起來像這個問題是web代理自動檢測,看到這樣的回答:Why is this WebRequest code slow?

我測試,它現在的作品沒有任何顯著在第一次通話中延遲。

+0

謝謝,非常完美! 對於遇到同樣問題的用戶,只需在調用下載之前將web客戶端的「代理」屬性設置爲空。 – Zoey 2012-05-10 08:44:41