Как вы ждете, пока сетевой поток получит данные для чтения? - PullRequest
7 голосов
/ 01 сентября 2009

В моем приложении есть рабочий поток, отвечающий за три разные вещи. Запросы для двух заданий появляются в написанных мною очередях, другое задание активируется, когда в потоке сети появляется запрос. Я хотел бы, чтобы моя рабочая нить ждала, когда не будет выполнено никакой работы. Это легко с двумя очередями, так как они предоставляют ManualResetEvent, который устанавливается, когда у них есть элементы, однако NetworkStream, похоже, не имеет этого. NetworkStream был получен из TcpClient.

Что мне нужно, так это код, который выглядит примерно так:

while (notDone)
{
    WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStream.HasData } );
    // ...
    if (netStream.DataAvailable)
    {
        netStream.Read(buffer, 0, 20);
        // process buffer
    }
}

Кто-нибудь знает способ получить WaitHandle, который устанавливается, когда NetworkStream имеет данные?

Ответы [ 2 ]

7 голосов
/ 01 сентября 2009

Вы можете использовать асинхронные методы NetworkStream и установить ManualResetEvent в методе EndReceive.

// ...
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 голосов
/ 01 сентября 2009

Возможно, самый простой способ - использовать дополнительный поток, который читает синхронно и помещает дополнительные данные в дополнительную очередь.

В качестве альтернативы вы можете использовать асинхронный ввод-вывод, но это несколько сложно - и вам все равно потребуется дополнительная очередь.

Хотя Socket имеет метод Select() (и вы можете получить сокет из NetworkStream), я не верю, что он предоставляет эту функциональность таким образом, который позволяет смешивать ее с другими видами ручек ожидания .

...