你如何等待网络流来读取数据?

Mar*_*own 7 c# multithreading networkstream

我的应用程序中有一个工作线程,负责三个不同的事情.在我编写的队列中,有两个作业的请求出现,另一个作业在网络流上出现请求时被激活.我希望我的工作线程在没有工作要做的时候等待.这两个队列很容易,因为它们暴露了一个在有​​项目时设置的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
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道获取在NetworkStream有数据时设置的WaitHandle的方法?

Has*_*niH 7

您可以使用NetworkStream的async方法并在EndReceive方法中设置ManualResetEvent.

// ...
netStream.BeginRead(buffer, offset, callback, state);
// ...
Run Code Online (Sandbox Code Playgroud)

在回调方法中

netStream.EndRead(ar);
netStreamManualResetEvent.Set();
Run Code Online (Sandbox Code Playgroud)

然后你的代码

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
    }
}
Run Code Online (Sandbox Code Playgroud)