1

私はC#でTCPサーバーを作成しており、非同期通信にBeginXXXメソッドとEndXXXメソッドを使用しています。私が正しく理解していれば、BeginXXXを使用すると、メインスレッドが新しい接続を受け入れ続けている間、リクエストはスレッドプールで処理されます(リクエストの準備ができている場合)。

問題は、これらのAsyncCallbackの1つでブロッキングアクションを実行するとどうなるかということです。タスクとしてブロッキング操作を実行する方が良いでしょうか?タスクもスレッドプールを使用しますね。

ユースケースは次のとおりです。

メインスレッドは、BeginAcceptを使用して接続を受け入れるリスニングソケットをセットアップし、BeginReceiveを使用してそれらの接続のリスニングを開始します。完全なメッセージが受信されると、そのメッセージの内容に応じて関数が呼び出されます。すべての場合の80%で、これらの関数はデータベースのクエリ/挿入/更新を開始します。

4

2 に答える 2

2

.net 4.5 で導入された SocketAsyncEventArgs を使用することをお勧めします

ここから始められるいくつかの読み物があります

私をクリックしてください

于 2012-09-30T20:47:32.090 に答える
1

問題は、これらの AsyncCallbacks の 1 つでブロッキング アクションを実行するとどうなるかということです。ブロッキング操作をタスクとして実行した方がよいでしょうか?

これを頻繁に、または長時間行うと、ThreadPool が大きくなります。アプリがクラッシュする可能性があります。

そのため、できるだけブロックしないようにしてください。でも、多少なら許容できるはずです。ThreadPool は 500 ミリ秒ごとに 1 つの新しいスレッドで成長することに注意してください。そのため、妥当な数のスレッドで平準化されることを確認してください。

鈍い手段は、プールの MaxThreads を制限することです。

タスクもスレッドプールを使用しますね。

はい、選択肢は限られています。

于 2012-09-30T20:19:51.427 に答える