2

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

私人 ManualResetEvent 停止;

私人无效接收()
{
    而 (!this.stopping.WaitOne(10))
    {
        而(this.client.Available > 0)
        {
            // 读取和处理数据
        }
    }
}

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

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

实际上,我想要的是一个 WaitHandle,它告诉我 TcpClient 上何时有数据可用。这样,我可以使用 WaitHandle.WaitAny。有什么办法可以做到这一点,或者有人可以建议一种替代方法吗?

这不能成为一个麻烦,因为它需要一个相当高性能和轻量级的后台进程。

4

1 回答 1

3

您需要BeginRead在底层使用该方法NetworkStream。这将返回IAsyncResult具有AsyncWaitHandle属性的 a。现在您创建一个 's 数组,将in [0] 和in [1]WaitHandle粘贴,然后使用该数组调用,它将返回设置的句柄的索引,或者超时。AsyncWaitHandleManualResetEventWaitHandle.WaitAny()WaitTimeout

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

BeginRead 的帮助说您需要一个回调函数,但如果您愿意,您可以为此传递 Null 并在基本函数中编写所有代码。

于 2010-02-26T18:11:05.013 回答