非同期ソケットの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
iPentec all rights reserverd.