2015-09-27 32 views
1

有人可以請澄清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似乎馬上調用回調?它是否正確?這樣做的核心方法是什麼?

+0

這樣的代碼只會增加問題,它不能解決任何問題。您已經從autoEvent的等待調用中獲得了完美的超時。少一個線程比賽錯誤,你必須修復。 –

+0

對不起,你能擴展你的意思嗎?基本上,我從服務器發送一個消息到Web客戶端,然後客戶端會通過消息回覆消息。如果服務器沒有收到此消息,我想重新發送最後一條消息作爲失敗保護。 autoEvent如何幫助這個呢? –

+0

使用AutoResetEvent的一點是,您在代碼中的其他地方等待它發出信號。通常使用WaitOne()調用,您可以在該調用中指定超時。次要問題正是你想要解決的問題。如果客戶端沒有響應,則它掛起或重新發送消息不會解決問題。或者它負載過重,只是沒有完成這項工作,在這種情況下,通過給予更多的工作來解決問題。如果您需要比TCP更可靠的方法,那麼您應該使用MessageQueue。 –

回答

1

https://msdn.microsoft.com/en-us/library/yz1c7148(v=vs.110).aspx

指定零(0)立即重新啓動定時器。

你走了。

+0

是的,我覺得這有點模棱兩可?這意味着設置爲零將重新啓動它。它似乎觸發它?在我的情況下是否需要timeout.infinite? –

+0

是的,使用Timeout.Infinite。零不是特例。當你傳遞x時,它意味着在x毫秒後調用回調函數。這裏是0毫秒。 – usr