私はWindowsVista/ Sevenで非常にうまく機能するac#コードを持っていますが、WindowsXPでは機能しません。
問題のある部分は「マルチキャスト」ノードであり、基本的にマルチキャストアドレス+ポートを介してデータを読み書きします。
ネットワークに対して読み取り/書き込みを行う部分はシングルトンです。
このシングルトンにアクセスするすべてのスレッドは、いつリッスンを開始する必要があるか、いつ停止するかを示す必要があります。
ソケットは、少なくとも1つのスレッドが「開始」する必要があるときにリッスンされ、すべてのスレッドが「停止」するときに停止します(Startメソッドが返すGuidトークンを指定する必要があります)。
この開始/停止メカニズムは、ネットワーク上で何が起こっているかをスレッドが確認する必要がない場合に、そのためにメモリを消費しないようにするためのものです。
私が得た問題は、WindowsXPで次の例外が発生したことです。
System.Net.Sockets.SocketException (0x80004005): The I/O operation has been aborted because of either a thread exit or an application request
at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)
at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)
いくつかの検索の後、Windows XP以下では、スレッドが終了すると、OSはすべてのI/Oリソースを解放するように見えます。(VB.NET 3.5 SocketExceptionは展開では発生しますが、開発マシンでは発生しません)。
この動作を回避する方法はありますか?私の場合、実行が終了する前に終了するスレッドを作成するのは正常であり、多くの場合、そのソケットを解放したくないのでしょうか。
それが不可能な場合、これをどのように処理しますか?