如何在C#中只触发一个计时器事件?

3

如何使计时器事件只触发一次。 例如,我有一个计时器,每10分钟引发一个事件。 所引发的事件需要10分钟或更长时间才能完成执行。 我希望在事件完成后重置计时器。 换句话说,在任何时候我都不想引发超过1个事件实例。

3个回答

14

使用 System.Timers.Timer 而不是 Threading 计时器。

将 AutoReset 设置为 false。

完成后再次启动它。


+1 是为了 MyTimer.AutoReset = false。否则,有人可能会忘记手动管理 Start()Stop() 的调用。 - Onion-Knight

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

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);
    }
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接