每天早上Timers.Timer迟到2-5秒

时间:2014-05-27 16:14:34

标签: c# timer

我有System.Timers.Timer,用于安排运行的某些任务。我有两个BlockingCollection队列等待计时器触发并将一些任务放入队列:

private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
   Logger.WriteTrace("Timer elapsed", "Timer elapsed after waiting: "+ DateTime.Now);
   lock (globalLock)
   {
      if (!_stop)
      {
         Logger.WriteTrace("Timer elapsed", "Iterating through schedules");
         DateTime now = DateTime.Now;
         foreach (T schedule in schedules)
         {
            DateTime occurence = schedule.GetNextOccurrence(now);
            if ((occurence - now).TotalMilliseconds < DefaultDelay)
            {
               Logger.WriteTrace("Run times", "Task added to the queue");
               priorityDictionary[schedule.IsParallel].Add(schedule);
            }
         }

         double nextWake = CalcualteNextWake(DateTime.Now.AddMilliseconds(DefaultDelay));
         SetInterval(nextWake);
      }
   }
}

在SetInterval方法中我有

if (interval > 0)
{
   _timer.Interval = interval;

   // starting timer, cause by design it is not Autoreset
   Logger.WriteTrace("Setting next wake after: ",
      interval.ToString() + " at " + DateTime.Now.AddMilliseconds(interval));

   _timer.Start();
}
else
{
   Logger.Error("Wrong interval");
}

所以我注意到计时器的奇怪行为,每天写入的最后一条日志消息都说是smth:

12:37:59##Trace####Setting next wake after: ##78839662.0084 at 5/27/2014 10:31:58 AM##

每天第一条消息都说:

10:32:03##Trace####Timer elapsed##Timer elapsed after waiting: 5/27/2014 10:32:03 AM##

计时器的每次其他过程都运行良好且准确,并且在“设置下一个唤醒”消息中完全相同,因此计时器仅在每天首次运行并且始终在2-5秒之间。我在代码中找不到任何可能成为问题的东西,看起来效果很好,并且我在白天计时器过程中没有任何问题。有没有人对这个问题的原因有什么想法?

谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,在你的代码中,你在Logger.WriteTrace中使用 DateTime.Now

为什么不创建一个变量并像

一样使用它
DateTime now = DateTime.Now;

Logger.WriteTrace("Timer elapsed", "Timer elapsed after waiting: "+ now);

还有SetInterval方法

Logger.WriteTrace("Setting next wake after: ",
      interval.ToString() + " at " + now.AddMilliseconds(interval));