你如何等待一个网络流有数据读取?(How do you wait for a Network Str

2019-07-04 06:14发布

我在我的应用程序中的工作线程,负责三个不同的东西。 对两个工作在我写队列调高请求,其他作业时请求变成了一个网络流激活。 我想我的工作线程等待,没有做工作的时候。 因为他们暴露时设置他们的项目,但是的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的?

Answer 1:

您可以使用的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
    }
}


Answer 2:

最简单的方法可能是使用一个额外的线程读取同步,并把额外的数据到一个额外的队列。

另外,您可以使用异步IO,但是这有点棘手 - 和你仍然需要有一些额外的队列。

虽然Socket有一个Select()方法(你可以从一个插座获得NetworkStream )我不相信它公开的方式,它可以让你与其他类型的等待句柄的混了此功能。



文章来源: How do you wait for a Network Stream to have data to read?