2009-07-25 8 views
1

.NETは、ネットワークI/Oのための良い非同期モデルを持っています。しかし、すべてのコールバックはスレッドプールからのIOスレッドで起こっています。JavaのNIOセレクタの.NETと同等のもの

Javaのセレクタのように、単一のスレッドで複数のストリームを扱う.NET対応のものはありますか?または、スレッドプールのコールバックは、この単一のスレッドアプローチよりも拡張されますか?非同期動作について

おかげで、

ドッド

+0

私はsoemthingを得ると思う:そこにあるSocket.Select .NETで。 –

+0

今、私の質問は、サーバー側でselect()またはBeginAccept()のどちらが優れていますか? –

答えて

2

はIOハンドルは、スレッドプールに関連付けられています。非同期操作が完了すると、(各ストリームの)コールバックが同じスレッドを使用して実行される場合と実行されない場合があります。使用可能なスレッドプールスレッドがコールバックを処理できる可能性があります。同じスレッドが複数のコールバック実行時条件に基づくコールバック。私は密接セレクタAPIに精通していないんだけどhere掲載例を見てから、すべてのイベントが発生するまで、セレクタが待機しているようですドッドさんのコメント

に追加の返信:

ホープこれは

EDITに役立ちます。本当?そうであれば、呼び出し元は、あるイベントが他のイベントより早く発生しても、すべてのイベントが発生するのを待たなければなりません。 セレクタが発生するとすぐにイベントを処理すると、セレクタが別のイベントが到着している間にセレクタがコールバックを処理している状況に陥る可能性があります(この場合、受信イベントがキューに入れられると思います別の場所ではイベントをドロップすることになります)が、イベントが直交している場合にはスループットが低下し、発生したらすぐに処理する必要があります。

.NETの非同期モデルは、新しいスレッドを作成するオーバーヘッドを減らすために、スレッドプールの中心に配置されています(高価な操作なので)。スレッドプールが最大になっていることを確認している場合は、プール内のスレッド数をdocumentedとしてここで増やすことができます。デュアルコアボックスでは、2つのスレッドのみが実行され、他はすべてブロックされるため、考慮する必要があるかもしれません。

これが役に立ちます。その後、コンテキストの切り替えは悪夢のようになります

+0

ThreadPoolとスケジューリングアルゴリズムは、TPLをサポートし、スレッドのよりスマートなスケジューリングを実行するために.NET4で大幅な見直しを実施しています(作業) –

0

おかげAbhijeet、

まあ、私の懸念は、いくつかの非常に忙しいsenariosで、多くの非同期のコールバックが同時に起こると、我々は、スレッドが不足している、ということです。この特定のケースでは、非同期コールバックが適切な選択ですか?または、Select()を使用する必要がありますか?

+0

マイクロソフトではこれが問題になるかどうかを8年前から確認しています。 –

+0

こんにちはドッド、これは本当に@ Abhijeetの質問に対するコメントではなく、新しい答えではありません。(そんなところで歓迎します) –

+0

@Dodd: –

関連する問題