代码之家  ›  专栏  ›  技术社区  ›  bohdan_trotsenko

在指定时刻运行repetitive方法(windows,.net等)(如时钟)

  •  0
  • bohdan_trotsenko  · 技术社区  · 16 年前

    这不是一个紧急或重要的问题,更像是练习。

    如何在特定时刻运行函数?越精确越好。

    例如,我有一个表示时间的方法。我想在XX点、XX:15:00(最好是000毫秒)、XX:30:00.000、XX:45:00.000运行它。

    目前我有一个(几乎是无限的)循环,它检查日期时间。现在,计算要睡眠的时间跨度,为那个inverval_

    这种方法的副作用是待机模式。似乎OS并没有减少起床后的睡眠时间,所以当我的笔记本电脑在xx:01待机时,在xx:13唤醒时,线程仍然处于休眠状态,因此错过了xx:15:00.000的时刻。

    也许有一种更简单的方法可以精确地说“在xx:00:00.000调用这个函数”。

    4 回复  |  直到 14 年前
        1
  •  2
  •   jeroenh    16 年前

    这个 Quartz.Net library 看来你在找什么。它是一个非常灵活的开源作业调度库,有很好的教程。它似乎也得到了积极的维护(2009年5月的最新版本)

    使用这个库,您可以使用各种调度模式调度作业,其中“在一天中的某个时间(到毫秒)”。( see features of quartz.net )

    不过,我不确定它是否能应付待命事件…

        2
  •  1
  •   Tim Cooper    14 年前

    您可以尝试捕获Windows睡眠模式事件,以便当Windows进入该模式时,可以将变量设置为当前时间。然后,当Windows唤醒时,使用该变量计算经过的毫秒数,以便将计时器同步到正确的时间。看看这个 link ,它可能会帮助您:

        3
  •  0
  •   Alan Moore    16 年前

    我只需要睡一个较小的时间间隔(比如10秒,无论您想要什么粒度),然后确定是否计划运行队列中的下一个操作(并运行它)。根据检查代码的效率,您可能会发现这样做需要非常少的CPU。

    您还将处理时钟更改的其他边缘情况(由用户/时区等重置),这比处理睡眠/唤醒事件复杂得多。

        4
  •  0
  •   Atmocreations    16 年前

    如果不需要对其进行编码,您可以使用Windows的内置任务执行功能,您可以在控制面板中找到它。不知道确切的标题叫什么…”“计划任务”或…你可以指定一个可执行文件,一个时间点,如果我是对的,你可以指定一些重复。

    我一点也不确定这个方法触发事件的精确性…

    当我必须实现这种类型的东西时,我使用System.Timers.Timer和TimeSpan(以便定义分辨率)进行了一种方法。这种方法从来不是很精确,但也不是必需的。为了得到更好的结果,也许在启动时,您可以将这个计时器与当前系统时钟同步到一个“整数”,然后,比如,设置一个间隔,每隔15分钟勾选一次……

    当做

    推荐文章