2011-07-14 89 views
2

我正在使用Web爬蟲,我想使用HttpWebRequest。它允許異步操作,如BeginGetResponse,但使用HttpWebRequest.Create的連接不是異步的 - 我想同時創建大約1,000個連接,所以使用此方法(使用一個額外的異步線程),我甚至不能獲得2個連接,因爲直到第二個連接已經完成下載內容的第一個連接,並且就好像我連接到網頁後而不是同時連接。異步HttpWebRequest

我在想,如果我有事先連接使用HttpWebRequest的約1000倍,而無需創建線程噸或任何的...

感謝的好方法。

編輯: 最終它不是緩慢和阻塞的HttpWebRequest,它是BeginGetResponse - 它阻塞,直到發送請求標頭爲止?我怎麼能繞過這個,使用異步發送以及BeginGetRequestStream?

回答

1

所有這些連接都會進入同一個域嗎?

嘗試添加該到你的應用程序/ web.config中

<system.net> <connectionManagement> <添加地址= " * " MAXCONNECTION = /> </connectionManagement > </system.net >

0

我不認爲你可以在同一個線程上建立多個連接。每個連接需要一個線程。但是您可以修改您的設計以使其更具可擴展性。

你可以讓一個控制線程完成所有繁重的工作(或者可能是其中的幾個),每個這樣的控制線程都會產生幾個子線程,這些子線程出去並獲取數據並將它們放入父類中的某種數組中類。然後控件類可以回收​​子線程。一旦子線程完成,它會得到另一個「任務」。主要思想,恕我直言,是分離從檢索的數據處理爬行。獲取它,存儲並稍後處理。

希望這有助於以某種方式:)

+0

最終它不是緩慢和阻塞的HttpWebRequest,而是BeginGetResponse - 它在發送請求標頭之前阻塞?我怎麼能繞過這個,使用異步發送以及BeginGetRequestStream? – Symbol

0

沒有理由,這應該被阻塞。異步Web請求的工作方式有些古怪,這可能會迫使你的異步請求同步。對於初學者,如果你真的發佈數據,你必須使用BeginGetRequestStream(你不能混合異步和同步)看到:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

如果我正確地記得沒有實際發生WebRequest.Create,它只是設置對象,請求直到BeginGetRequestStream或BeginGetResponse才啓動(取決於它是一個帖子還是獲取)。

另一大注,在我的調查結果,有很多更延遲與閱讀它來自EndGetResponse比還有來自請求的流。您還應該在流上使用不同的讀取版本。