我有一个服务使用的dll。它的基本任务是每X分钟运行一次,并执行一些系统检查。在我的dll中,我有一个顶级类,它声明了一个System.threading.timer和一个计时器回调。类的构造函数使用我的timerCallback函数初始化线程。在我的"Onstart“处理程序中,我用timercallback初始化计时器,并将下一个时间设置为触发和间隔时间。在我的情况下,它是每10分钟。通常,在这10分钟的检查中,没有什么可做的,但服务被强制每天至少在设定的时间做一次。
我的问题:我发现在测试期间,每天执行每日检查的时间正在慢慢远离预期的开始时间8.30。例如,在大约20多天的时间里,我的时间从8点半流逝到了08.31.35。它每天大约漂移4-6秒。
我的问题是:有人知道时间为什么会这样漂移吗?我怎么才能让它遵守分配的时间呢?
谢谢
发布于 2011-12-08 22:04:19
时间“漂移”是因为计时器根本不是那么精确。如果你需要尽可能接近某个时间间隔运行你的代码,你可以这样做:
public void MyTimerCallback(object something) {
var now = DateTime.UtcNow;
var shouldProbablyHaveRun = new DateTime(
now.Year, now.Month, now.Day,
now.Hour, now.Minute - (now.Minute % 10), 0);
var nextRun = shouldProbablyHaveRun.AddMinutes(10.0);
// Do stuff here!
var diff = nextRun - DateTime.UtcNow;
timer.Change(diff, new TimeSpan(-1));
}...assuming您正在使用System.Threading.Timer实例。如果您正在使用任何其他类型的计时器(有几种!),请修改示例。
发布于 2011-12-08 21:55:34
如果需要执行操作,为什么不每分钟检查一次?
即:
if (DateTime.Now.Minute % 10) == 0 发布于 2011-12-08 21:59:05
在您的计时器方法处理程序中执行操作需要有限的时间,因此它不会每隔10分钟到第二分钟发生一次,特别是如果您在执行检查等操作之后安排下一次唤醒。如果你已经在检查回答是时候这么做了,你应该让你的计时器更频繁地触发,以满足你需要的解决方案,并相信你的检查,当它应该执行一些东西,以确保它做到了。您可能需要某种类型的持久性,以确保它不会执行两次(如果这很重要),以防关闭/重新启动,并且知道它是否已经运行的状态不在内存中。
https://stackoverflow.com/questions/8431995
复制相似问题