web-dev-qa-db-ja.com

BeginConnectとConnectAsyncの違いは何ですか?

BeginConnectConnectAsyncの違いは何ですか?続いて、BeginDisconnectDisconnectAsyncの違いは何ですか?

ConnectAsync ドキュメントには次のように記載されています。

「リモートホスト接続の非同期要求を開始します。」

BeginConnect ドキュメントalsoは次のように述べています。

「リモートホスト接続の非同期要求を開始します。」

DisconnectAsyncBeginDisconnect の両方も同じことを述べています。

「リモートエンドポイントから切断するための非同期要求を開始します。」

これらのメソッドペアの違いは何ですか?どちらを使用する必要がありますか?

28
Kiril

Socket.ConnectAsyncは、BeginConnectによって提供される3つのパラメーターと比較して、より多くの情報を含むパラメーターとしてSocketAsyncEventArgsを提供します。また、ConnectAsyncがBeginConnectより後に導入され、タイムアウトに関連するいくつかの問題を解決することも知っています(この議論のソースを今は思い出せません)。可能な場合はConnectAsyncを優先します(ただし、最小の.NET 2.0 SP1が必要です)。

コールバックについては、ConnectAsyncに問題があります。これが懸念される場合は、次の説明があります。 System.Net.Sockets.Socket.AcceptAsyncモデルを使用する場合のスタックオーバーフロー および AsyncCallBack CompletedSynchronously

SilverlightではBeginConnectメソッドがサポートされていないため(ConnectAsyncのみがサポートされています)、クライアント側のSilverlightアプリケーションを開発する場合は別の懸念事項になる可能性があります。

また、2つのアプローチで使用されるパターンは異なります。議論は次のとおりです: 。NETのソケットのBegin *と* Asyncの間にパフォーマンスの違いはありますか?

14
Teoman Soygul

XXXXAsyncメソッドが導入されたのは、サーバーに多くの接続されたクライアントがある場合に発生するメモリスラッシングの量を減らすためです。 ドキュメントで説明されているプーリング と組み合わせると、このAPIを使用すると、古いBeginXXX APIと比較して、GCが実行する必要のある作業の量が大幅に削減されます。

ドキュメントは次のように言っています

これらの拡張機能の主な機能は、大量の非同期ソケットI/O中にオブジェクトの繰り返し割り当てと同期が回避されることです。 System.Net.Sockets.Socketクラスによって現在実装されているBegin/Endデザインパターンでは、非同期ソケット操作ごとにSystem.IAsyncResultオブジェクトを割り当てる必要があります。

したがって、接続されている何千ものクライアント用のサーバーを作成しているのでない限り、XXXXAsyncを気にする必要はありません。 APIは実装がかなり難しく、エンタープライズレベルのサービス以外にはほとんどメリットがありません。

11
spender