2012-09-26 38 views
5

問題:我需要從不同主機下載數百張圖片。每臺主機都有20至數百幅圖像。WebClient是下載http數據的最佳方式嗎?

解決方案:每次需要通過WebClient的DownloadData方法下載圖像時,使用new WebClient方法。

或將要更好地保持開放套接字連接,使使用較低級別調用http請求的池?

是它昂貴打開/關閉TCP連接(我假設是Web客戶端做什麼),讓使用池聽起來更有效率?

+0

最好的代碼是在你需要的時間內實現你所需要的結果而沒有錯誤的代碼。因此,您可以評論與當前代碼相比有哪些需要改進的地方(假設您已經估算出您可以下載圖片的速度有多快,並且您的當前代碼下載比您的目標慢,但有一些空間可以改善,直到達到網絡限制)。 –

+0

我應該補充說速度是最受關注的。 – sanjosep43

+0

+1非常有趣的問題。 –

回答

6

我相信這WebClient用途將已經集中的HTTP連接的底層基礎架構,所以沒有必要做這個。當然,您可能需要使用類似Wireshark的一些示例URL。

從根本上說,我會採取同樣的方法來此與其他編程任務 - 寫在工作的最簡單的方法的代碼,然後檢查是否執行以及足夠滿足您的需求。如果是這樣,你就完成了。如果沒有,請使用適當的工具(網絡分析器等)來解決問題爲什麼它表現不佳,只有在解決問題時才使用更復雜的代碼。

我的經驗是,如果WebClient不符合您的需求,那麼它就沒有問題 - 但它不會像WebRequest那樣爲您提供相當細緻的控制。如果您不需要需要那個控制,請使用WebClient

+0

謝謝。我不認爲WebClient會使用一個池。我必須用wireshark檢查。我也讀過你的書,非常好! – sanjosep43

+0

@ user261490喬恩的書很棒,但是這個評論與這個問題無關。請儘量讓你的意見與問題或答案相關,以便對其他人有所幫助 –

+0

@ user261490喬恩就在這裏。有一點需要考慮的是從MS中查找[並行庫](http://msdn.microsoft.com/en-us/library/dd460720.aspx),並結合您選擇的任何內容。這將允許您下載多個線程,當然受帶寬限制。確保你在完成時關閉()連接......我犯了一次錯誤。 – iMortalitySX

0

我用HttpWebRequestHttpWebResponse湊什麼我想要的。當然,除非有需求提供服務,但即使有時也存在限制(業務限制),我經常喜歡從純粹的http請求中挖掘html。有時只是讓感覺更像開發人員,你知道...

+3

你沒有給出任何理由*爲什麼*你使用'HttpWebRequest' /'HttpWebResponse',這使得這個回答沒有那麼有用。 –