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