我有一個奇怪的問題。我有一個單元測試,一直停留在運行模式下。當我在調試中運行相同的測試時,沒有斷點,測試通過每次。單元測試通過調試,但運行時掛起
基本上,它是一個套接字連接測試。我首先斷開一個套接字,然後嘗試重新連接,並試圖檢查重新連接是否成功。
在連接代碼的某處,我檢查是否有套接字異常。發生這種情況時,用戶會在對話框中看到一些選擇,而連接代碼通過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());
這令我的原因,是我等待的diconnect代碼的返回,調用connect代碼之前。斷開代碼的最後一部分是這樣的:
lclSocket.Shutdown(SocketShutdown.Both);
lclSocket.Close();
OnSocketDisconnected(new PFSocketConnectionEventArgs(ipEp));
return true;
難道是因爲Socket.Shutdown(),和/或Socket.Close()方法來運行它的主題?因此,即使我從我的斷開連接代碼返回值,套接字實際上並沒有真正斷開連接?
我從來沒有使用過.NET Socket API,所以我在這裏幫不了你。我假設lclSocket是一個System.Net.Sockets.Socket類實例?看看這些文檔,我可以看到在多線程環境中運行時有各種異步方法。您應該通過註釋代碼來退出代碼更改,直到代碼在調試和發佈中運行。然後仔細閱讀文檔,確保您使用了正確的方法。同時斷言一切。然後逐步添加一小段代碼,直到您縮小錯誤。 – 2010-07-19 16:17:02