在我的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。我有什么方法可以做到这一点,或者有人可以提出另一种方法吗?
这不是一个躲避,因为它需要一个相当高效的轻量级背景过程。
答案 0 :(得分:3)
您需要在基础BeginRead
上使用NetworkStream
方法。这将返回IAsyncResult
,其AsyncWaitHandle
属性。现在你创建一个WaitHandle
的数组,将AsyncWaitHandle
放在[0]中,ManualResetEvent
放在[1]中,然后用数组调用WaitHandle.WaitAny()
,然后将返回所设置句柄的索引,或者WaitTimeout
按时返回。
一旦你知道它是设置的AsyncHandle,你就可以使用EndRead完成读取,并将数据输入缓冲区。
BeginRead的帮助说你需要一个回调函数,但你可以为此传递Null并根据你的喜好编写基函数中的所有内容。