如何在C#中只引发一个Timer事件?

时间:2010-08-04 19:22:50

标签: c# events timer

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

3 个答案:

答案 0 :(得分:14)

使用System.Timers.Timer而不是线程化

将AutoReset设置为false。

然后在完成后再次启动它。

答案 1 :(得分: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 */
}

现在我的计时器将在完成整个过程后重新开始

答案 2 :(得分: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);
    }
  }
}