30

BeginConnectとはどう違いConnectAsyncますか?BeginDisconnectとはどう違いDisconnectAsyncますか?

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

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

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

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

DisconnectAsyncとの両方がBeginDisconnect同じことを述べています。

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

これらのメソッドのペアと、どちらを使用すべきかの違いは何ですか?

4

2 に答える 2

14

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 の間にパフォーマンスの違いはありますか?

于 2011-04-23T15:21:33.120 に答える
12

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

ドキュメントには次のように書かれています:

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

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

于 2011-04-23T15:34:16.233 に答える