gpt4 book ai didi

c# - TcpClient - 等待数据可用

转载 作者:行者123 更新时间:2023-11-30 22:47:07 26 4
gpt4 key购买 nike

在我的 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。我有什么办法可以做到这一点,或者有人可以建议替代方法吗?

这不能成为一个障碍,因为它需要一个相当高效且轻量级的后台进程。

最佳答案

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

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

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

关于c# - TcpClient - 等待数据可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2343495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com