我有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秒之间。我在代码中找不到任何可能成为问题的东西,看起来效果很好,并且我在白天计时器过程中没有任何问题。有没有人对这个问题的原因有什么想法?
谢谢。
答案 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));