首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# .NET 2 Threading.Timer -时间漂移

C# .NET 2 Threading.Timer -时间漂移
EN

Stack Overflow用户
提问于 2011-12-08 21:51:49
回答 5查看 2.5K关注 0票数 6

我有一个服务使用的dll。它的基本任务是每X分钟运行一次,并执行一些系统检查。在我的dll中,我有一个顶级类,它声明了一个System.threading.timer和一个计时器回调。类的构造函数使用我的timerCallback函数初始化线程。在我的"Onstart“处理程序中,我用timercallback初始化计时器,并将下一个时间设置为触发和间隔时间。在我的情况下,它是每10分钟。通常,在这10分钟的检查中,没有什么可做的,但服务被强制每天至少在设定的时间做一次。

我的问题:我发现在测试期间,每天执行每日检查的时间正在慢慢远离预期的开始时间8.30。例如,在大约20多天的时间里,我的时间从8点半流逝到了08.31.35。它每天大约漂移4-6秒。

我的问题是:有人知道时间为什么会这样漂移吗?我怎么才能让它遵守分配的时间呢?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-08 22:04:19

时间“漂移”是因为计时器根本不是那么精确。如果你需要尽可能接近某个时间间隔运行你的代码,你可以这样做:

代码语言:javascript
复制
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实例。如果您正在使用任何其他类型的计时器(有几种!),请修改示例。

票数 6
EN

Stack Overflow用户

发布于 2011-12-08 21:55:34

如果需要执行操作,为什么不每分钟检查一次?

即:

代码语言:javascript
复制
if (DateTime.Now.Minute % 10) == 0 
票数 0
EN

Stack Overflow用户

发布于 2011-12-08 21:59:05

在您的计时器方法处理程序中执行操作需要有限的时间,因此它不会每隔10分钟到第二分钟发生一次,特别是如果您在执行检查等操作之后安排下一次唤醒。如果你已经在检查回答是时候这么做了,你应该让你的计时器更频繁地触发,以满足你需要的解决方案,并相信你的检查,当它应该执行一些东西,以确保它做到了。您可能需要某种类型的持久性,以确保它不会执行两次(如果这很重要),以防关闭/重新启动,并且知道它是否已经运行的状态不在内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8431995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档