需求服務器
有一個winform程序,網絡
用來調試路由器和對路由器吞吐量進行測試socket
須要後臺不斷的接收來自udp服務器端的數據,同時要發送數據到服務器端(無線路由器)測試
設計時候,經過一個線程,for(;;)死循環來接收數據,spa
另外一個經過界面按鈕發送相關指令(實際狀況是線程
正常流程,沒有任何問題.設計
可是調試
該流程中,有一個步驟是winform經過http協議上傳固件到路由器,orm
等待路由器重啓完畢,對象
正常流程,是沒有任何問題.
可是客戶環境,尤爲重啓期間,測試PC機由於找不到ap接入點,會去介入其它ap,有可能不是同一網段,致使網絡環境已經變動.
此時,udp沒法發送,也沒法接收.
發送端能夠經過udp重連設置.接收端使用的發送端的udp靜態對象,但依然沒法接收.
不管.NET提供的socket仍是updclient封裝udp,都沒法很好的處理這種狀況.
所以,解決思路就是
經過一個信號量
ManualResetEvent event_ok = new ManualResetEvent(false);
ManualResetEvent event_th = new ManualResetEvent(false);
ok的信號量是用來測試路由器是否通順,不經過ping的緣由是由於非測試路由器也能夠ping通.
每次發送後,等待路由器返回ok的指令,若是沒有收到指令,等待信號量超時.
則認爲網絡中斷
設置線程同步變量爲false
接收線程當同步變量爲false時候,設置th信號量,
則發送端線程等待線程終止信號量後從新開啓接收線程,再次發送便可.