有人可以請澄清System.Threading.Timer的正確用法。使用.Change重置System.Threading.Timer
我有一個服務器客戶端確認響應模型。如果在設定的時間段內沒有收到確認,我想要做的就是從服務器重新發送記錄的消息。
所以當發送第一條消息時,我存儲一個Timer;
AutoResetEvent autoEvent = new AutoResetEvent(false);
TestsTimeout timeout = new TestsTimeout(firstTest, _socket);
TimerCallback resendCallback = timeout.ResendMessage;
Timer timeoutTimer = new Timer(resendCallback, autoEvent, timeoutPeriod, timeoutPeriod);
然後,當接收到消息的確認時,我只想重置時間併發送下一個消息。
timeout.Change(0, timeoutPeriod);
現在,我跟着MSDN這個例子,但是,0似乎馬上調用回調?它是否正確?這樣做的核心方法是什麼?
這樣的代碼只會增加問題,它不能解決任何問題。您已經從autoEvent的等待調用中獲得了完美的超時。少一個線程比賽錯誤,你必須修復。 –
對不起,你能擴展你的意思嗎?基本上,我從服務器發送一個消息到Web客戶端,然後客戶端會通過消息回覆消息。如果服務器沒有收到此消息,我想重新發送最後一條消息作爲失敗保護。 autoEvent如何幫助這個呢? –
使用AutoResetEvent的一點是,您在代碼中的其他地方等待它發出信號。通常使用WaitOne()調用,您可以在該調用中指定超時。次要問題正是你想要解決的問題。如果客戶端沒有響應,則它掛起或重新發送消息不會解決問題。或者它負載過重,只是沒有完成這項工作,在這種情況下,通過給予更多的工作來解決問題。如果您需要比TCP更可靠的方法,那麼您應該使用MessageQueue。 –