我想在.NET 3.5中使用HttpWebRequest和HttpWebResponse,在異步運行它們:BeginGetRequestStream,EndGetRequestStream,BeginWrite,EndWrite,BeginGetResponse,EndGetResponse,BeginRead,EndRead - 處理請求是異步的。HttpWebRequest和HttpWebResponse理想的異步緩衝區大小
我有幾個線程發送大量的併發請求。 EndRead和EndWrite都是阻塞操作 - 它們阻止當前線程,而對流實際讀/寫完成後,我試圖爲這些操作提供理想的輸入/輸出緩衝區大小。
我的推理是這樣的:因爲我一次有多個活動請求,他們會繼續觸發回調以讓線程知道有一些數據可用或數據已發送。如果我的緩衝區很大,通過線路讀取/寫入數據需要更長的時間,所以EndRead/EndWrite會阻止更長的時間。這會迫使同一個線程上的其他請求等待一段時間,因爲它們的通知必須等到線程解除阻塞。
所以,我的問題是,在這種情況下,讀/寫緩衝區的大小是多少。我在想每個2048字節,但是我在各種博客中看到的一些示例代碼顯示了非常不同的值。
在此先感謝您的任何想法。
[如果您將委託傳遞給Begin *方法的回調參數,則該操作在操作完成時執行,您可以從那裏調用End *,這將幾乎立即返回。無需阻擋]。有趣的是,誰是真正的「開始*」工作。它是一個來自ThreadPool的線程,可以完成呼叫並等待您。與創建自己的線程完成相同的工作有什麼不同? –
這取決於。但是在IO操作的情況下,[使用IO完成端口](http://msdn.microsoft.com/zh-cn/library/aa365198.aspx)。這意味着'Begin'方法開始工作並設置端口。當工作完成後,端口將被觸發,並且回調將在線程池線程上執行。這與爲此創建新線程不同,因爲創建新線程總是分配一百萬字節。 – svick
所以你說,BeginA在一個委託fxn中等待,在那個fxn startBit中等待另一個委託等等(而不是在一個線程中調用A(); B())你真的知道他的代碼需要這種複雜性。正如我在回答中所說的:「過早的優化是萬惡的根源」 –