非同期ソケットのShutdownでObjectDisposedException例外が起きる現象についての紹介です。
非同期ソケットを利用している場合、ShutdownでObjectDisposedException例外が発生する場合があります。原因はいくつかありますが、ソケットが完全に切断されていない状態で再接続した場合、再接続したソケットをShutdownするとObjectDisposedException例外が出る場合があります。
Socket = new Socket(..);
Socket.BeginConnect(...);
Socket.WaitFor();
----------------------------
HELLO --->
<--- OK
GET info.xml --->
<--- (data)
BYE --->
<--- OK
----------------------------
Socket.Shutdown();
Socket.Close();
Socket.Dispose();
Socket = new Socket(..);
Socket.BeginConnect(...);
Socket.WaitFor();
----------------------------
HELLO --->
<--- OK
GET info.xml --->
<--- (data)
BYE --->
<--- OK
----------------------------
(ここで、接続が終わったと考えて再接続してしまう。)
Socket = new Socket(..);
Socket.BeginConnect(...);
Socket.WaitFor();
----------------------------
HELLO --->
<--- OK
GET info.xml --->
<--- (data)
BYE --->
<--- OK
----------------------------
Socket.Shutdown();
Socket.Close();
Socket.Dispose();
Socket.Shutdown(); ←ここでObjectDisposedException例外
Socket.Close();
Socket.Dispose();