3

UdpClient異なるポートで同時にパケットを送信する必要があるため、クラスのインスタンスが5000個あるアプリケーションを実行しています。

私は現在System.Timers.Timer、で実行されるを使用していThreadPoolます。非常に短くInterval、多くのElapsedイベントが発生します。

BeginReadの/EndRead関数を使用して動作するようにアプリケーションを変更する方がよいでしょうUdpClientか?

4

1 に答える 1

3

IO 操作 (つまり、ネットワーク、ファイル システムなど) を使用する場合は、常に非同期操作を使用する必要があります。これらの操作は、既知のIO 完了ポートを使用します。つまり、データの送信中に CPU リソースを消費しません。要求されたデータがロードされるとすぐに、ThreadPool からスレッドを取得し、ハンドラーをこのスレッドのキューに入れます。あなたの場合、CPU リソースを浪費しています。有用な作業を行う代わりに、スレッドはデータが送信されるまで待つだけです。また、ThreadPool のスレッド数には制限があります (通常は CPU コアの数と同じです)。したがって、あなたの場合、一度に2つのクライアントとの間でのみデータを送受信します。

非同期メソッド (特に BeginXXX/EndXXX) は非常に複雑に見えるかもしれませんが、使用法を大幅に簡素化するラッパーが多数あります。たとえば、Rx の FromAsyncPattern拡張メソッドを使用したり、新しいasync/await 非同期モデルを使用したりできます。

于 2012-12-20T04:28:21.403 に答える