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

可能重复:
System.Timer流逝的事件似乎在.Net的短时间间隔内发生延迟

我在我的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();
}

在计时器已过的方法中不使用_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属性吗? 它可能会有所不同,因为你没有在实时操作系统上工作,但是每次调用都会添加第二个响应,听起来更像是一个比Timer更糟糕的bug。

链接地址: http://www.djcxy.com/p/63009.html

上一篇: Incorrect elapse time for System.Timers.Timer

下一篇: To Dispose or not to Dispose (CA2000)