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(。。

System.Timers.Timer的逝去时间不正确

在每次迭代中,计算从现在到您想要触发下一个计时器的时间点之间的时间差。然后将间隔设置为该值。这样可以防止漂移。

//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。