代码之家  ›  专栏  ›  技术社区  ›  Martin Brown

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

  •  9
  • Martin Brown  · 技术社区  · 16 年前

    我的应用程序中有一个工作线程,负责三件不同的事情。其中两个作业的请求出现在我编写的队列中,另一个作业在网络流上出现请求时被激活。我希望我的工作线程在没有工作要做时等待。这对两个队列来说很容易,因为它们公开了一个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的方法吗?

    3 回复  |  直到 16 年前
        1
  •  7
  •   HasaniH    16 年前

    // ...
    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
        }
    }
    
        2
  •  2
  •   Jon Skeet    16 年前

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

    或者,您可以使用异步IO,但这有点棘手,而且您仍然需要一些额外的队列。

    尽管 Socket 有一个 Select() 方法(你可以从 NetworkStream )我不认为它以一种让你将其与其他类型的等待句柄混合使用的方式暴露了这一功能。

        3
  •  0
  •   isgoed    6 年前

    我发现,如果你打电话来 NetworkStream.Read 随着 size = 0 ,它实际上会阻止:

    networkstream.Read(buffer, 0, 0);
    

    documentation