9

私のアプリケーションには、3 つの異なることを担当するワーカー スレッドがあります。ジョブのうちの 2 つのリクエストは、私が作成したキューに表示されます。もう 1 つのジョブは、ネットワーク ストリームでリクエストが表示されるとアクティブ化されます。実行する作業がない場合、ワーカー スレッドを待機させたいと思います。2 つのキューでは、アイテムがあるときに設定される 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
    }
}

NetworkStream にデータがあるときに設定される WaitHandle を取得する方法を知っている人はいますか?

4

3 に答える 3

7

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
    }
}
于 2009-09-01T19:02:27.130 に答える
2

最も簡単な方法は、同期的に読み取り、追加のデータを追加のキューに入れる追加のスレッドを使用することです。

別の方法として、非同期 IO を使用することもできますが、これはややこしい作業です。さらに、追加のキューが必要になります。

SocketにはメソッドがSelect()ありますが (そして からソケットを取得できますNetworkStream)、この機能を他の種類の待機ハンドルと混在させるような方法で公開しているとは思いません。

于 2009-09-01T10:44:00.213 に答える