非同期ソケットのShutdownでObjectDisposedException例外が起きる - C#
非同期ソケットの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();
ObjectDisposedException例外が出る場合のフロー
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();
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-08-20
作成日: 2010-06-23