2010-02-26 56 views
2

在我的C#應用​​程序中,我有一個線程,基本上不斷從TcpClient中讀取,直到告訴停止。我用WaitHandles爲了這個目的,例如:TcpClient - 等待數據可用

private ManualResetEvent stopping; 

private void Receive() 
{ 
    while (!this.stopping.WaitOne(10)) 
    { 
     while (this.client.Available > 0) 
     { 
      // Read and process data 
     } 
    } 
}

正如你所看到的,我等着被告知線程停止。如果沒有,它會從TcpClient中讀取所有數據並循環。

我的問題是10ms的延遲,我寧願沒有。我可以減少它,但我更喜歡一個解決方案,在該解決方案中,程序將暫停,直到線程被告知停止或更多數據可用。

實際上,我要的是一個WaitHandle的,告訴我,當數據可用上的TcpClient。這樣,我可以使用WaitHandle.WaitAny。有什麼辦法可以做到這一點,或有人可以建議一種替代方法嗎?

這不可能是一個bodge因爲它需要一個相當高性能 - 和 - 輕量級後臺進程。

回答

3

你需要使用BeginRead方法的基本NetworkStream上。這將返回一個IAsyncResult,它有一個AsyncWaitHandle屬性。現在創建一個WaitHandle的數組,將AsyncWaitHandle貼在[0]中,將ManualResetEvent寫入[1],然後用數組調用WaitHandle.WaitAny(),它將返回設置的句柄索引或按時間返回WaitTimeout出。

一旦你知道它是我們設置的AsyncHandle,您可以使用EndRead完成讀取,數據進入你的緩衝區。

爲的BeginRead幫助說,你需要一個回調函數,但如果你喜歡,你可以通過空,這和代碼一切都在你的基地功能。