我在我的应用程序中的工作线程,负责三个不同的东西。 对两个工作在我写队列调高请求,其他作业时请求变成了一个网络流激活。 我想我的工作线程等待,没有做工作的时候。 因为他们暴露时设置他们的项目,但是的NetworkStream似乎并不具备这样的ManualResetEvent的这是很容易与两个队列。 该的NetworkStream已从一个TcpClient的检索。
我所后的代码看起来是这样的:
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
}
}
最简单的方法可能是使用一个额外的线程读取同步,并把额外的数据到一个额外的队列。
另外,您可以使用异步IO,但是这有点棘手 - 和你仍然需要有一些额外的队列。
虽然Socket
有一个Select()
方法(你可以从一个插座获得NetworkStream
)我不相信它公开的方式,它可以让你与其他类型的等待句柄的混了此功能。