Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每天早上定时器。定时器延迟2-5秒_C#_Timer - Fatal编程技术网

C# 每天早上定时器。定时器延迟2-5秒

C# 每天早上定时器。定时器延迟2-5秒,c#,timer,C#,Timer,我有一个System.Timers.Timer,用于安排一些任务的运行。我有两个BlockingCollection队列,它们正在等待计时器启动并将一些任务放入队列: private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) { Logger.WriteTrace("Timer elapsed", "Timer elapsed after waiting: "+ DateTime.Now);

我有一个
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);
      }
   }
}
所以我注意到计时器的奇怪行为,每天最后一条日志消息都是这样写的:

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秒之间。我在代码中找不到任何可能是问题的东西,看起来它工作得很好,而且我对日间计时器的流逝没有任何问题。有人对这个问题的起因有什么看法吗


谢谢。

好的,在代码中使用了日期时间。现在在Logger.WriteTrace中使用

为什么不创建一个变量并像这样使用它呢

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));

我不认为这是这里的问题,但你真的应该使用UtcNow。或者你的代码能容忍时钟一年跳两次吗?当你的程序长时间不执行代码时,操作系统会对它不友好。几乎每个内存页都将从RAM中调出。从DLL文件和分页文件加载它可能需要一段时间。功能,而不是bug。usr:我应该使用UtcNow,这是真的。汉斯·帕桑:我考虑过,但有办法避免吗?或者要求操作系统按照我需要的方式运行?5秒的延迟和计时器一样长,我认为操作系统应该以某种方式处理这个问题。如果程序每隔几秒就激活一次,就不应该有分页。此外,如果没有内存压力,当激活程序中每天只激活一次的部分时,您将看到接近零的延迟。内存有压力吗?这不是我问题的答案,我更改它只是为了能够知道添加到队列的操作时间,以防万一。
Logger.WriteTrace("Setting next wake after: ",
      interval.ToString() + " at " + now.AddMilliseconds(interval));