[英]Stopping A Timer And Preventing The Elapsed Event To Fire
從MSDN:
在ThreadPool線程上引發Timer.Elapsed事件,因此事件處理方法可能在一個線程上運行,而對Timer.Stop方法的調用在另一個線程上運行。 這可能導致在調用Stop方法之后引發Elapsed事件。
我有一個運行特定時間的計時器,然后經過並設置一個標志。 有時我想停止計時器並重新啟動它。
當前,當我嘗試停止計時器時,經過的事件仍然會觸發(有時),因此,當我不希望它發生時,將設置我的標志。
如何停止標記,並確保經過的事件不會觸發?
**編輯**
在事件處理程序中,我嘗試在運行代碼之前檢查計時器的狀態以確保其狀態已啟用,並且還嘗試在停止計時器時設置標志,並在運行代碼之前檢查該標志。
都不起作用
Timer t = new Timer(4000);
t.Elapsed += t_Elapsed;
t.Stop();
t.Dispose();
最后一行將刪除計時器,因此不會發生經過的事件。
如果在調用stop和dispose時計時器已經在執行過去的函數,則執行將完成。
我也多次遇到類似的問題。
//Timer init.
var _timer = new System.Timers.Timer
{
AutoReset = true,
Enabled = true,
Interval = TimeSpan.FromSeconds(15).TotalMilliseconds //15 seconds interval
};
_timer.Elapsed += DoSomethingOnTimerElapsed;
//To be called on timer elapsed.
private void DoSomethingOnTimerElapsed(object source, ElapsedEventArgs e)
{
//Disable timer.
_timer.Enabled = false; //or _timer.Stop()
var markers = new Dictionary<string, ConversationItem>();
try
{
//does long running process
}
catch (Exception ex)
{
}
finally
{
if (_shouldEnableTimer) //set its default value to true.
_timer.Enabled = true; //or _timer.Start()
}
}
//somewhere in the code if you want to stop timer:
_timer.Enabled = _shouldEnableTimer = false;
//At any point, if you want to resume timer add this:
_timer.Enabled = _shouldEnableTimer = true;
為什么要這樣做?
假設try塊中的代碼花費更多時間。 因此,當您禁用計時器時(_timer.Enabled = false or _timer.Stop())
,很有可能try塊中的代碼仍在執行。 因此,在完成最后的任務后,如果沒有標志( _shouldEnableTimer
)檢查,則會再次啟用它。 因此,我通過添加其他標志檢查來防止出現您的問題。
為了更清晰,請遍歷代碼和添加的注釋。 希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.