System.Timers.Timer逐渐增加间隔?

时间:2016-12-13 11:21:35

标签: c# .net timer

我一直面临着一个非常独特的问题。我正在使用System.Timers.Timer每分钟触发一个方法。渐渐地,我开始知道时间间隔不是恒定的。

为了测试并确保问题,我只运行一个每分钟都有一个功能的计时器。并且输出令人震惊,定时器间隔秒不是恒定的。它们正在发生变化,因此产生了一个问题。

12/13/2016 3:39:26 PM
12/13/2016 3:40:25 PM
12/13/2016 3:41:25 PM
12/13/2016 3:42:25 PM
12/13/2016 3:43:25 PM
12/13/2016 3:44:26 PM
12/13/2016 3:45:26 PM
12/13/2016 3:46:26 PM
12/13/2016 3:47:26 PM
12/13/2016 3:48:26 PM
12/13/2016 3:49:26 PM
12/13/2016 3:50:26 PM
12/13/2016 3:51:26 PM

可以注意到间隔逐渐增加。当天花费时会出现问题。因此,问题就像我必须在一分钟内处理并且日期改变一样。

代码很简单

System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 60000;
timer.Elapsed += timer_Elapsed;
timer.Start();

2 个答案:

答案 0 :(得分:1)

System.Timers.Timer不是那么精确。请查看备注部分here

答案 1 :(得分:0)

我设法解决了这个问题。

这个解决方案很简单

在全球范围内设置两项检查;

static bool _IsDirty = false, _TimerChecked = true;

然后处理ElapsedEventHandler内的逻辑,因为让DataSynchronizer是委托方法,然后实现可以是

private Task AdwordsPullDataSynchronizer(System.Timers.Timer timer)
{

     if (!_TimerChecked)
     {
          _IsDirty = false;
          timer.Stop();
          var interval = Convert.ToDouble(Math.Abs(DateTime.Now.Second - 60));
          timer.Interval = (interval + 2) * 1000;
          timer.Start();
          _TimerChecked = true;
     }

     if (DateTime.Now.Second > 10)
     {
         _IsDirty = true;
         _TimerChecked = false;
     }


     //Place your interval logic here

     if (_IsDirty)
     {
        timer.Stop();
        var interval = Convert.ToDouble(Math.Abs(DateTime.Now.Second - 60));
        timer.Interval = (interval + 2) * 1000;
        timer.Start();
     }

     return Task.FromResult(0);
}

我已经实现了相当清晰的保存侧逻辑。

代码正在做什么?它将检查间隔秒是否大于10然后它将reset the timer并将间隔设置为下一个ElapsedEvent 2nd second。然后它会重置fixed the intervalElapsedEvent 2nd second