我正在用C#編寫一個服務器,它創建一個(很長,甚至可能是無限)IEnumerable<Result>
以響應客戶端請求,然後將這些結果傳回給客戶端。讓客戶端提取數據
我可以設置它,以便如果客戶端讀取速度很慢(或者一次完全可能幾秒鐘不讀),服務器將不需要等待緩衝區空間的線程停止清除這樣它可以拉動下一對Result
,將它們序列化,並將它們填充到網絡中?
這是如何NetworkStream.BeginWrite
的作品?關於何時調用回調方法,文檔不清楚(對我而言)。這是否基本上立即發生,只是在另一個線程,然後阻止EndWrite
等待實際的寫作發生?當套接字API下溢中的某種較低級緩衝區發生時會發生嗎?數據實際寫入網絡時會發生嗎?它在被確認後會發生嗎?
我很困惑,所以有可能整個問題都是離題的。如果是這樣,你能轉過來指點我正確的方向來解決我所期望的是一個相當普遍的問題嗎?
這個問題中有一些信息不太準確。例如,正如我在我的文章中所解釋的那樣,只要數據到達發送緩衝區,回調並不總是被調用。這取決於實施,但即使在Windows上,也取決於IO完成端口是否可用。有時可能會立即調用它並阻止EndWrite。我還會補充說,爲每一次發送創建一個線程是不明智的。至少,使用線程池。但是,這只是讓事情變得複雜,而且最有可能的做法比BeginWrite的效率低。 – IRBMe 2009-07-12 09:08:28