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