我有一个奇怪的问题。我有一个单元测试一直卡在运行模式。当我在 Debug 中运行相同的测试时,没有断点,测试每次都通过。
基本上,它是一个套接字连接测试。我首先断开一个套接字,然后尝试重新连接,并尝试检查重新连接是否成功。
在连接代码的某处,我检查是否有套接字异常。发生这种情况时,用户会在对话框中看到一些选择,而连接代码通过 AutoResetEvent 挂起,等待决定。
正是这个 AutoResetEvent 挂起系统。它必须由单元测试中的代码提供。但我的问题是,这怎么会在调试模式下通过?Visual Studio 自动设置 AutoResetEvents 的调试模式有什么特别之处吗?
编辑
这确实是一个竞赛条件。我在断开代码之后在代码中添加了延迟,现在它可以工作了。但让我感到奇怪的是,一开始就有一个比赛条件。让我通过粘贴一些代码来详细说明。
这是测试代码:
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() 方法运行它的线程吗?因此,即使我从断开代码中返回一个值,套接字实际上并没有真正断开?