我有一个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");
}
所以我注意到计时器的奇怪行为,每天最后一个日志消息写的是这样的:
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秒之间。我找不到任何可能在代码中出现问题的东西,似乎它工作得很好,而且我在白天计时器的流逝中没有任何问题。有人知道是什么导致了这个问题吗?
谢谢。
在代码中使用DateTime。现在在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));