2010-08-04 55 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); 
    } 
    } 
} 
相关问题