System.Timers.Timer的逝去时间不正确
本文关键字:时间 不正确 Timers Timer System | 更新日期: 2023-09-27 18:07:47
可能重复:
.Net 中的System.Timer消逝事件似乎在短时间内延迟触发
我在windows服务中使用System.Timers.Timer。间隔设置为60000毫秒,但每隔一段时间,计时器间隔就会增加几毫秒
2011-09-05 00:00:37,177 [80] INFO -
timer_Elapsed;
2011-09-05 00:01:37,187 [8] INFO -
timer_Elapsed;
2011-09-05 01:24:38,279 [71] INFO -
timer_Elapsed;
但例如,我需要在37秒内经过计时器,但下班一段时间后,我们有38、39、40的计时器。。秒
我不需要非常精确的计时器,但我每次都需要经过37+/-1秒。。
我怎样才能解决这个问题???
我在中一次性设置Interval属性
protected override void OnStart(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
EmailReminderService.Logger.Info("Service started");
_timer.Interval =Convert.ToInt32(ConfigurationManager.AppSettings["Interval"]);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
_timer.Enabled = true;
}
private void timer_Elapsed(object source, System.Timers.ElapsedEventArgs e)
{
EmailReminderService.Logger.Info("timer_Elapsed;");
EmailReminderManager manager = new EmailReminderManager();
manager.EmailReminderProcessing();
}
在计时器运行时间方法中,不使用计时器对象(_T(。。
在每次迭代中,计算从现在到您想要触发下一个计时器的时间点之间的时间差。然后将间隔设置为该值。这样可以防止漂移。
//Once
DateTime start=DateTime.UtcNow;// Or if you prefer that the event
// happens on the same second no matter when
// the program started you can simply
// use a constant here
//At the end of the timer handler
int interval=(int)((DateTime.UtcNow-start).TotalSeconds*1000);
const int targetInterval=60000;
interval(interval+targetInterval/2)%targetInterval+targetInterval/2;
timer.Interval=interval;
这会选择30到90秒之间的时间间隔,这样你就能准确地达到目标时间。
该程序优雅地处理UtcNow<start
,因为当用户更改系统时钟时可能会发生这种情况。
我们有38、39、40的计时器。。秒
你确定你没有用计时器的Interval
属性做什么吗?它可能会有所不同,因为你不是在实时操作系统上工作,但每次调用都会添加一秒钟,这听起来更像是你身边的bug,而不是Timer
中的bug。