2010-08-04 16 views
3

如何獲得計時器事件以一次觸發一個計時器事件。例如,我有一個計時器,每10分鐘引發一次事件。 引發的事件需要10分鐘或更長時間才能完成執行。 我希望計時器在事件結束後重置。 換句話說,我不想在任何時候舉辦一次以上的活動。如何在C#中只引發1個Timer事件?

回答

6

通常我做的是有我的事件停止計時器時,它的提出,然後在事件過程完成重新啓動定時器:

private void timerHandler(object sender, TimerElapsedEventArgs e) 
{ 
    Timer timer = (Timer)sender; 
    timer.Stop(); 
    RunProcess(); 
    timer.Start(); 
} 

public void RunProcess() 
{ 
    /* Do stuff that takes longer than my timer interval */ 
} 

現在我的計時器將再次對過程

+1

這不會引入競爭條件(http://msdn.microsoft.com/en-us/library/system.timers.timer.stop.aspx)這不是AutoReset解決方案的問題? – Jon 2012-04-18 05:57:29

14
完成啓動

使用System.Timers.Timer不是線程的一個

將AutoReset設置爲false。

然後當你完成後再次啓動它。

+0

對於'MyTimer.AutoReset = false'爲+1。否則有人可能會忘記手動管理'Start()'和'Stop()'調用。 – 2010-08-04 20:19:51

+2

我不明白爲什麼手動停止/開始獲得更多選票 – 2012-02-02 20:04:32

0

可能很難停止定時器的效率或邏輯。以下代碼同步跳過事件。

static readonly object key = new object(); 

void TimerHandler(object sender, TimerElapsedEventArgs e) 
{ 
    if(Monitor.TryEnter(key)) 
    { 
    try 
    { 
     //do your stuff 
    } 
    finally 
    { 
     Montitor.Exit(key); 
    } 
    } 
} 
相關問題