2016-08-09 9 views
0

比較的大量のクライアントを処理できるソケットサーバーを作成しようとしています。このようなタスクにはさまざまなアプローチがあります。最初に、着信接続ごとに別々のスレッドを使用し、2つ目はasync/awaitパターンを使用する方法です。C#ランタイムのスレッドプールを使用しない非同期ソケットの読み込み

コンテキストの切り替え時にすべてのシステムのリソースが失われるなど、比較的少数のスレッドが存在するため、最初のアプローチは悪いです。

ワーカースレッドの数が限られた独自のスレッドプールを持つことができるので、ディスパッチャーは着信接続を受け取り、キューに追加し、非同期ソケット読み取りメソッドを呼び出してデータを受信しますソケットからこのデータ/エラーをキューに追加して処理します(エラー処理クライアントの応答、DB関連の作業)。

async/awaitの内部実装についてはあまり知られていませんが、非UIアプリケーションを使用している間に理解したように、すべての継続は、ランタイムのスレッドプールを使用しているTaskScheduler.Currentによって行われます。 。着信接続の量が増えると、ランタイムのスレッドプールに空きスレッドがなくなるか、システムが応答しなくなるほどの大きさになります。

この問題では、async/awaitは1クライアント/ 1スレッドの問題と同じ問題を引き起こしますが、ランタイムスレッドプールのスレッドがデフォルトSystem.Threading.Thread( 1MBのスタックサイズ+〜1/2MBの制御データと考える)。

アプリケーションが私の明示的にサイズのスレッドプールを使用するように、10のソケットでいくつかのカーネル割り込みを待つためのスレッドを作る方法はありますか? (つまり、10個のソケットから1つのスレッドにデータがある場合、1つのスレッドが起動して処理します)

+0

非同期ソケットメソッドのすべてが内蔵されておそらくあなたのためにうまく動作します.NETスレッドプールにIOCPを使用しています。独自のスレッドプールは必要ありません。 –

+0

自分のスレッドプールの必要性は、受信したデータを使って多くの作業を行い、クライアントに戻って話す必要があるという事実から来ています。非同期メソッドが可能な限りほとんど仕事をしないようにします。 –

+0

カスタムスレッドプールを必要とするような記述は表示されません。組み込みのものは正常に動作するはずです。 –

答えて

1

この場合、async/awaitは1クライアント/ 1スレッドの問題

非同期に実行されているスレッドリーチコードでは、スレッドがスレッドプールに返され、別の要求を処理できるように制御が呼び出し元に返されるため、1クライアント/スレッドはブロックされないため

一部がasnyc /のawaitについていかなるのinterstingのブログがあります: 1

+0

素晴らしい記事、ありがとう! –

関連する問題