我一直面临着一个非常独特的问题。我正在使用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();
答案 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 interval
到ElapsedEvent 2nd second
。