У меня странная проблема. У меня есть модульный тест, который постоянно застревает в режиме бега. Когда я запускаю тот же тест в Debug без точек останова, тест проходит каждый раз.
По сути, это тест подключения к сокету. Сначала я отсоединяю сокет, а затем пытаюсь переподключиться, и я пытаюсь проверить, было ли переподключение успешным.
Где-то в коде подключения, я проверяю, было ли исключение сокета. Когда это происходит, пользователю предоставляется возможность выбора в диалоговом окне, в то время как код соединения зависает через AutoResetEvent, ожидая решения.
Именно этот AutoResetEvent зависает в системе. Это должно быть обеспечено кодом в модульном тесте.
Но мой вопрос: почему это происходит в режиме отладки? Есть ли что-то особенное в режиме отладки, при котором AutoResetEvents автоматически устанавливаются Visual Studio?
EDIT
Это действительно было состояние гонки. Я добавил задержку в коде после кода отключения, и теперь он работает. Но мне все еще кажется странным, что для начала есть условие гонки. Позвольте мне уточнить, вставив часть кода.
Это тестовый код:
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, прежде чем вызывать код connect. Последняя часть кода отключения выглядит следующим образом:
lclSocket.Shutdown(SocketShutdown.Both);
lclSocket.Close();
OnSocketDisconnected(new PFSocketConnectionEventArgs(ipEp));
return true;
Это потому, что методы Socket.Shutdown () и / или Socket.Close () запускают его потоки? Таким образом, даже если я возвращаю значение из моего кода отключения, сокет действительно не отключен?