我的应用程序中有一个工作线程负责三件不同的事情。对其中两个作业的请求出现在我编写的队列中,当网络流上出现请求时,另一个作业就会被激活。我希望我的工作线程在没有工作要做时等待。这对于两个队列来说很容易,因为它们公开了一个 ManualResetEvent,该事件在它们有项目时设置,但是 NetworkStream 似乎没有这个。已从 TcpClient 检索 NetworkStream。
我所追求的是看起来像这样的代码:
while (notDone)
{
WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStream.HasData } );
// ...
if (netStream.DataAvailable)
{
netStream.Read(buffer, 0, 20);
// process buffer
}
}
有谁知道如何获取当 NetworkStream 有数据时设置的 WaitHandle 吗?
您可以使用 NetworkStream 的异步方法并在 EndReceive 方法中设置 ManualResetEvent。
// ...
netStream.BeginRead(buffer, offset, callback, state);
// ...
回调方法内部
netStream.EndRead(ar);
netStreamManualResetEvent.Set();
那么你的代码
while (notDone)
{
WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStreamManualResetEvent} );
// ...
if (netStream.DataAvailable)
{
// make the buffer from the AsyncState in the callback method available here
// process buffer
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)