ベストアンサー1
これは(非常に愚かな)設計によるものと思われます。コード内でこの例外をスローしてキャッチする必要があります。
MSDNでは確かにこれについては何も言及されていないようですが、別の非同期ソケットメソッドのドキュメントを見ると、接続開始()、次のことがわかりました:
BeginConnect() メソッドへの保留中の呼び出しをキャンセルするには、ソケットを閉じます。非同期操作の進行中に Close() メソッドが呼び出されると、BeginConnect() メソッドに提供されたコールバックが呼び出されます。その後の EndConnect(IAsyncResult) メソッドの呼び出しでは、操作がキャンセルされたことを示す ObjectDisposedException がスローされます。
BeginConnect の場合にこれが適切な方法であれば、BeginReceive の場合も同様でしょう。これは確かに Microsoft の非同期 API の設計としては良くありません。ユーザーが通常のフローの一部として例外を必ずスローしてキャッチするようにすると、デバッガーが煩わしくなるからです。操作が完了するまで「待機」する方法は実際にはありません。そもそも Close() が操作を完了させるからです。