1

ほとんどの人はリスナーソケットを構築しているようで、処理のために呼び出される「イベント」を含めます。例: SocketConnected、DataReceived。プログラマーはリスナーを初期化し、「イベント」メソッドにバインドしてソケット イベントを受信し、サービスを構築します。

大規模な実装では、リスナーでデリゲートを避ける方が効率的だと思います。そして、コールバック メソッドですべての処理を完了します。次に来るコマンドを知っているという知識に基づいて、データを受信するために異なるコールバックを使用する可能性があります。(これは私のメッセージフレーム構造の一部です)

スケーラビリティの高い例を探しましたが、非同期ソケットの標準の MSDN 実装、または MSDN の例を複製する他のプログラマーのバリエーションしか見つかりません。

誰かが私を正しい方向に向けることができる良い経験を持っていますか?


注> サービスは何千ものクライアントを保持し、ほとんどの場合、クライアントは接続されたままになり、サービスによって受信された更新は、接続されている他のすべてのクライアントに送信されます。オブジェクト指向データベース向けの同期型P2P型システムです。

4

3 に答える 3

1

私からあなたへの唯一のアドバイスは次のとおりです。最も明快なスタイルを採用してください。

測定されていない速度の違いのために、言語機能全体を排除するのは時期尚早です。メソッド呼び出し/デリゲート呼び出しのコストがコードのボトルネックになる可能性はほとんどありません。確かに、あるものと別のものとの相対的なコストをベンチマークすることはできますが、プログラムがメソッド呼び出しの設定に 1% しか費やしていない場合、大きな違いがあっても実際にはプログラムに影響しません。

サーバーを本当に使いたい場合は、すべての IO が非同期で発生することを確認し、スレッドプールで長時間実行されるタスクを実行しないことをお勧めします。.net4.5 async/await は、これらすべてを本当に簡素化します...より保守しやすいコードに使用することを検討してください。

于 2012-08-17T02:18:43.413 に答える
1

イベント コールとコールバックの違いはごくわずかです。コールバックは、デリゲート (または関数ポインター) の単なる呼び出しです。なんらかのコールバックなしで非同期操作を行うことはできず、あらゆる種類の結果を期待できません。

イベントを使用すると、それらをマルチキャストできます。これは、複数のコールバック呼び出しを意味します。つまり、複数のメソッドを呼び出すため、コストが高くなります。ただし、それを行う場合は、おそらくそれを行う必要があります。別の方法は、複数のデリゲートを用意して、それらを手動で呼び出すことです。したがって、実質的なメリットはありません。多くの場合、イベントには送信者/イベント引数が含まれます。そのため、追加のオブジェクトと eventargs インスタンスの作成があります。しかし、それがパフォーマンスに影響を与える状況を見たことはありません。

個人的には、イベント ベースの非同期パターンは使用しません。(.NET 4.5 より前のバージョンでは) 非同期プログラミング モデルの方がどこにでもあることがわかりました。.NET 4.5 では、タスクの非同期パターン (Begin で始まるメソッドと End で始まるメソッドの 2 つではなく、Async で終わる単一のメソッド) を好みます。

new AsyncCallback(Async_Send_Receive.Read_Callback)さて、質問が例えば次の違いである場合:

s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                     new AsyncCallback(Async_Send_Receive.Read_Callback), so);

そしてちょうどAsync_Send_Receive.Read_Callback例:

s.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                     Async_Send_Receive.Read_Callback, so);

2 番目は 1 番目の省略形です。AsyncCallbackデリゲートはまだ隠れて作成されています。

しかし、ほとんどのものと同様に。パフォーマンス、テスト、および測定において目立った違いはないと一般に認められている場合でも. ある方法が別の方法よりも多くの利点 (パフォーマンスを含む) を持っている場合は、その方法を使用してください。

于 2012-08-17T03:13:23.980 に答える
0

私は、ソケットを使用したライブ ベッティング システムと、双方向のアクティブ メッセージングを使用して仕事をしてきました。WCF P2P のようなソケット レイヤーを処理するためのフレームワークを使用するのは、非常に簡単です。すべての接続の問題を処理し、ビジネス ロジックに集中できます。

于 2012-08-17T02:38:04.963 に答える