2011-10-05 58 views
0

我想在.NET 3.5中使用HttpWebRequest和HttpWebResponse,在異步運行它們:BeginGetRequestStream,EndGetRequestStream,BeginWrite,EndWrite,BeginGetResponse,EndGetResponse,BeginRead,EndRead - 處理請求是異步的。HttpWebRequest和HttpWebResponse理想的異步緩衝區大小

我有幾個線程發送大量的併發請求。 EndRead和EndWrite都是阻塞操作 - 它們阻止當前線程,而對流實際讀/寫完成後,我試圖爲這些操作提供理想的輸入/輸出緩衝區大小。

我的推理是這樣的:因爲我一次有多個活動請求,他們會繼續觸發回調以讓線程知道有一些數據可用或數據已發送。如果我的緩衝區很大,通過線路讀取/寫入數據需要更長的時間,所以EndRead/EndWrite會阻止更長的時間。這會迫使同一個線程上的其他請求等待一段時間,因爲它們的通知必須等到線程解除阻塞。

所以,我的問題是,在這種情況下,讀/寫緩衝區的大小是多少。我在想每個2048字節,但是我在各種博客中看到的一些示例代碼顯示了非常不同的值。

在此先感謝您的任何想法。

回答

1

我認爲一個更好的解決方案不會擔心緩衝區的大小太多,但不要阻塞線程。如果您將代理傳遞給Begin*方法的callback參數,那麼在操作完成時執行該回調,您可以從那裏調用End*,該回調將(幾乎)立即返回。不需要阻止。

關於緩衝區大小,如果他們真的對你很重要,你應該剖析並找出在你的特定情況下最好的方法。

+0

[如果您將委託傳遞給Begin *方法的回調參數,則該操作在操作完成時執行,您可以從那裏調用End *,這將幾乎立即返回。無需阻擋]。有趣的是,誰是真正的「開始*」工作。它是一個來自ThreadPool的線程,可以完成呼叫並等待您。與創建自己的線程完成相同的工作有什麼不同? –

+1

這取決於。但是在IO操作的情況下,[使用IO完成端口](http://msdn.microsoft.com/zh-cn/library/aa365198.aspx)。這意味着'Begin'方法開始工作並設置端口。當工作完成後,端口將被觸發,並且回調將在線程池線程上執行。這與爲此創建新線程不同,因爲創建新線程總是分配一百萬字節。 – svick

+0

所以你說,BeginA在一個委託fxn中等待,在那個fxn startBit中等待另一個委託等等(而不是在一個線程中調用A(); B())你真的知道他的代碼需要這種複雜性。正如我在回答中所說的:「過早的優化是萬惡的根源」 –

1

對於您應該設置的實際值,沒有明確的規則,除了避免顯而易見的極端情況。這實際上取決於您傳輸的數據類型以及它的數量。您可能想要將寫入緩衝區設置得相當高,但將讀取緩衝區設置得更低。這是因爲在涉及這種事情時,寫入(通常)比讀取更昂貴。

在這種情況下做的最好的事情是嘗試一些值,看看它們的規模。如有必要,您可以隨時更改它們。