2010-02-26 93 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帮助说,你需要一个回调函数,但如果你喜欢,你可以通过空,这和代码一切都在你的基地功能。