2

我正在使用带有计时器的 Windows 服务来安排每个时间间隔的作业。似乎 timer elapsed 事件被触发了不止一次。

这是一个代码示例:

private static System.Timers.Timer _timer = new System.Timers.Timer();

protected override void OnStart(string[] args)
{
      _timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
      _timer.Interval = 1000;
      _timer.Enabled = true;
      _timer.Start();
}

private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
      _timer.Enabled = false;
      _timer.Stop();

      //Do the job

      _timer.Enabled = true;
      _timer.Start();
}

你能帮助我吗?谢谢

4

1 回答 1

1

引发 Elapsed 事件的信号总是排队等待在 ThreadPool 线程上执行,因此事件处理方法可能在一个线程上运行,同时对 Stop 方法的调用在另一个线程上运行。这可能会导致在调用 Stop 方法后引发 Elapsed 事件。下一节中的代码示例显示了一种解决这种竞争条件的方法。

引用自:Timer.Stop 方法。请参阅页面上的代码示例。

于 2013-01-14T14:55:02.230 回答