2

私の C# アプリケーションには、停止するように指示されるまで、基本的に TcpClient から継続的に読み取るスレッドがあります。この目的で WaitHandles を使用します。たとえば、次のようにします。

プライベート ManualResetEvent 停止;

プライベートボイド受信()
{
    while (!this.stopping.WaitOne(10))
    {
        while (this.client.Available > 0)
        {
            // データを読み込んで処理する
        }
    }
}

ご覧のとおり、スレッドが停止するように指示されるのを待っています。そうでない場合は、TcpClient からすべてのデータを読み取り、ループします。

私が抱えている問題は、10ms の遅延です。私はそれを減らすことができましたが、スレッドが停止するように指示されるか、より多くのデータが利用可能になるまで、プログラムが一時停止するソリューションを好みます。

実際、私が欲しいのは、TcpClient でデータが利用可能になるタイミングを教えてくれる WaitHandle です。そうすれば、WaitHandle.WaitAny を使用できます。これを行う方法はありますか、または誰かが別のアプローチを提案できますか?

これは、かなり高性能で軽量なバックグラウンド プロセスである必要があるため、面倒ではありません。

4

1 に答える 1

3

BeginRead基になるのメソッドを使用する必要がありますNetworkStreamIAsyncResultこれにより、プロパティを持つが返されAsyncWaitHandleます。ここで、の配列を作成し、 in [0]、 in [1]をWaitHandle貼り付けてから、配列を呼び出します。これにより、設定されているハンドルのインデックスが返されるか、タイムアウトになります。AsyncWaitHandleManualResetEventWaitHandle.WaitAny()WaitTimeout

設定されているのがAsyncHandleであることがわかったら、EndReadを使用して読み取りを完了し、データをバッファーに取り込むことができます。

BeginReadのヘルプには、コールバック関数が必要であると記載されていますが、必要に応じて、これにNullを渡して、基本関数にすべてをコーディングできます。

于 2010-02-26T18:11:05.013 に答える