【问题标题】:TcpClient - waiting for data to become availableTcpClient - 等待数据可用
【发布时间】:2010-02-26 17:24:07
【问题描述】:

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

私人 ManualResetEvent 停止;

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

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

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

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

这不能成为问题,因为它需要是一个相当高性能且轻量级的后台进程。

【问题讨论】:

    标签: c# .net networking tcpclient


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多