TcpClient - 等待数据变为可用

时间:2010-02-26 17:24:08

标签: c# .net networking tcpclient

在我的C#应用​​程序中,我有一个基本上不断从TcpClient读取的线程,直到被告知停止。我为此目的使用WaitHandles,例如:

private ManualResetEvent stopping;

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

正如你所看到的,我正在等待线程被告知停止。如果还没有,它会从TcpClient读取所有数据并循环。

我遇到的问题是10毫秒延迟,我宁愿没有。我可以减少它,但我更喜欢一个解决方案,程序将暂停,直到线程被告知停止,或者有更多数据可用。

实际上,我想要的是WaitHandle,它告诉我什么时候TcpClient上有数据可用。这样,我可以使用WaitHandle.WaitAny。我有什么方法可以做到这一点,或者有人可以提出另一种方法吗?

这不是一个躲避,因为它需要一个相当高效的轻量级背景过程。

1 个答案:

答案 0 :(得分:3)

您需要在基础BeginRead上使用NetworkStream方法。这将返回IAsyncResult,其AsyncWaitHandle属性。现在你创建一个WaitHandle的数组,将AsyncWaitHandle放在[0]中,ManualResetEvent放在[1]中,然后用数组调用WaitHandle.WaitAny(),然后将返回所设置句柄的索引,或者WaitTimeout按时返回。

一旦你知道它是设置的AsyncHandle,你就可以使用EndRead完成读取,并将数据输入缓冲区。

BeginRead的帮助说你需要一个回调函数,但你可以为此传递Null并根据你的喜好编写基函数中的所有内容。