ソケットのBeginReceive()を中止するにはどうすればいいですか? 質問する

ソケットのBeginReceive()を中止するにはどうすればいいですか? 質問する

当然、BeginReceive()データがなければ終わりません。 MSDN示唆するその呼び出しはClose()中止されますBeginReceive()

しかし、Close()ソケットを呼び出すとDispose()、次のように実行されます。この素晴らしい答えEndReceive()オブジェクトはすでに破棄されているため、例外がスローされます (実際に破棄されています)。

どうすればいいでしょうか?

ベストアンサー1

これは(非常に愚かな)設計によるものと思われます。コード内でこの例外をスローしてキャッチする必要があります。

MSDNでは確かにこれについては何も言及されていないようですが、別の非同期ソケットメソッドのドキュメントを見ると、接続開始()、次のことがわかりました:

BeginConnect() メソッドへの保留中の呼び出しをキャンセルするには、ソケットを閉じます。非同期操作の進行中に Close() メソッドが呼び出されると、BeginConnect() メソッドに提供されたコールバックが呼び出されます。その後の EndConnect(IAsyncResult) メソッドの呼び出しでは、操作がキャンセルされたことを示す ObjectDisposedException がスローされます。

BeginConnect の場合にこれが適切な方法であれば、BeginReceive の場合も同様でしょう。これは確かに Microsoft の非同期 API の設計としては良くありません。ユーザーが通常のフローの一部として例外を必ずスローしてキャッチするようにすると、デバッガーが煩わしくなるからです。操作が完了するまで「待機」する方法は実際にはありません。そもそも Close() が操作を完了させるからです。

おすすめ記事