奇妙な問題があります。実行モードでスタックし続ける単体テストがあります。ブレークポイントなしでデバッグで同じテストを実行すると、テストは毎回合格します。
基本的にはソケット接続テストです。最初にソケットを切断してから再接続を試み、再接続が成功したかどうかを確認しようとしています。
接続コードのどこかで、ソケット例外があったかどうかを確認します。これが発生すると、ユーザーにはダイアログにいくつかの選択肢が表示され、接続コードはAutoResetEventを介してハングし、決定を待ちます。
システムをハングさせるのはこのAutoResetEventです。単体テストのコードで提供する必要があります。しかし、私の質問は、なぜこれがデバッグモードで通過するのかということです。AutoResetEventsがVisualStudioによって自動的に設定されるデバッグモードについて何か特別なことはありますか?
編集
それは確かに競合状態でした。切断コードの後にコードに遅延を追加しましたが、現在は機能しています。しかし、そもそも競合状態があるのは奇妙なことです。コードの一部を貼り付けて詳しく説明します。
これはテストコードです:
MySystem.FindEquipment(new List<string>(1) { "192.1.1.243:28000" });
MySystem.ConstructSystem();
MySystem.IsConstructedFlag.WaitOne();
Assert.AreEqual(1, MySystem.CommunicationController.HardwareIPList.Count);
PFFrame frame1 = MySystem.Frames["0.x.x"];
Assert.IsTrue(frame1.Disconnect());
Thread.Sleep(100);
Assert.IsTrue(frame1.Connect());
これが私を襲う理由は、接続コードを呼び出す前に、diconnectコードが返されるのを待っているからです。切断コードの最後の部分は次のようになります。
lclSocket.Shutdown(SocketShutdown.Both);
lclSocket.Close();
OnSocketDisconnected(new PFSocketConnectionEventArgs(ipEp));
return true;
Socket.Shutdown()やSocket.Close()メソッドがスレッドを実行しているためですか?したがって、切断コードから値を返しても、ソケットは実際には切断されていませんか?