パケットを非同期ループで処理するかどうか?
-
03-07-2019 - |
質問
C# で、BeginReceive/EndReceive メソッドを使用してネットワーク データを受信する場合、パケットを受信したらすぐに処理すべきではない理由はありますか?一部のタスクは CPU をかなり集中的に使用する可能性があります。私が質問したのは、パケットを処理キューにプッシュしてそこで処理する実装をいくつか見たからです。私にとって、これは冗長に思えます。なぜなら、私の知る限り、非同期メソッドは また スレッドプール上で動作します。
解決
Mitchが指摘しているように、完全なメッセージ/フレームを得るために十分なパケットを受信できる必要があります。ただし、そのフレームの処理をすぐに開始して、別のBeginReceiveを発行しない理由はありません。実際、処理に時間がかかると思われる場合は、I / Oプール(コールバックが発生する場所)からスレッドをブロックするよりも、ワーカースレッドプールに渡す方が良いでしょう。
さらに、接続の数が少ないと予想されない限り、各接続を処理するスレッドを生成することはあまりスケーラブルなアプローチではありませんが、ある程度の単純さという利点があります。
最近、ネットワークソケットからのデータ処理のパイプライン化に関する記事を書きました。これはこちら。
他のヒント
一般に、データ項目を「処理可能」にするには「十分な」パケットを受信する必要があります。
IMO、ジョブがデータを受信するスレッドを 1 つと、それを実際に処理するスレッドを別のスレッドに配置することをお勧めします。
所属していません StackOverflow