UdpClient
異なるポートで同時にパケットを送信する必要があるため、クラスのインスタンスが5000個あるアプリケーションを実行しています。
私は現在System.Timers.Timer
、で実行されるを使用していThreadPool
ます。非常に短くInterval
、多くのElapsed
イベントが発生します。
BeginRead
の/EndRead
関数を使用して動作するようにアプリケーションを変更する方がよいでしょうUdpClient
か?
UdpClient
異なるポートで同時にパケットを送信する必要があるため、クラスのインスタンスが5000個あるアプリケーションを実行しています。
私は現在System.Timers.Timer
、で実行されるを使用していThreadPool
ます。非常に短くInterval
、多くのElapsed
イベントが発生します。
BeginRead
の/EndRead
関数を使用して動作するようにアプリケーションを変更する方がよいでしょうUdpClient
か?
IO 操作 (つまり、ネットワーク、ファイル システムなど) を使用する場合は、常に非同期操作を使用する必要があります。これらの操作は、既知のIO 完了ポートを使用します。つまり、データの送信中に CPU リソースを消費しません。要求されたデータがロードされるとすぐに、ThreadPool からスレッドを取得し、ハンドラーをこのスレッドのキューに入れます。あなたの場合、CPU リソースを浪費しています。有用な作業を行う代わりに、スレッドはデータが送信されるまで待つだけです。また、ThreadPool のスレッド数には制限があります (通常は CPU コアの数と同じです)。したがって、あなたの場合、一度に2つのクライアントとの間でのみデータを送受信します。
非同期メソッド (特に BeginXXX/EndXXX) は非常に複雑に見えるかもしれませんが、使用法を大幅に簡素化するラッパーが多数あります。たとえば、Rx の FromAsyncPattern拡張メソッドを使用したり、新しいasync/await 非同期モデルを使用したりできます。