1

BeginReceive/EndReceive を使用してソケット IO を処理している場合、コールバックは IOCP スレッドによって呼び出されます。

受信が完了したら、データを処理する必要があります。

  • コールバックの呼び出しスレッドでそれを行う必要がありますか?
  • または、ThreadPool.QueueUserWorkItem を使用してタスクを実行する必要があります

通常、サンプルはコールバック スレッドで作業を行いますが、これは少し混乱します。

数百のアクティブな接続を扱っている場合、IOCP スレッドで処理を実行すると、数百のスレッドを持つプロセスになります。ThreadPool は同時スレッドの数を制限するのに役立ちますか?

4

2 に答える 2

2

誰にとっても一般的な「正しい答え」があるかどうかはわかりません。それは、個々のユースケースによって異なります。

これらは、ThreadPool パスを使用することを検討している場合に考慮すべき事項です。

アウト オブ オーダー / 同時メッセージ処理はサポートできますか?

ソケット A がメッセージ 1、2、および 3 を立て続けに受信すると、それらは同時に処理されるか、順不同で処理される可能性があります。

.NET には CPU ごとのスレッド プールがあり、1 つの CPU が機能しなくなると、他の CPU からタスクを「盗む」可能性があります。これは、メッセージがランダムな順序で実行される可能性があることを意味する場合があります。

順不同の処理がクライアントに与える可能性があることを考慮することを忘れないでください。たとえば、クライアントが応答を必要とする 3 つのメッセージを送信した場合、順不同で応答を送信すると問題になる可能性があります。

各メッセージを順番に処理する必要がある場合は、おそらく独自のスレッド プーリングを実装する必要があります。

サービス拒否の可能性について心配する必要がありますか?

1 つのソケットが突然データの群れを送信した場合、処理のためにそのすべてを受け入れると、内部キューとメモリが詰まる可能性があります。受け入れる未処理のデータの量を制限する必要がある場合があります。

于 2012-03-18T04:45:27.293 に答える