System.Timers.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();
System.Timers.Timer没有那么精确。 在这里查看备注部分。
我设法解决了这个问题。 解决方案很简单
在全球范围内设置两项检查;
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
。