簡體   English   中英

停止計時器並防止發生經過的事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM