在特定时刻(windows,.net等)运行重复方法(如时钟)

时间:2009-07-28 20:47:22

标签: .net windows winapi kernel

这不是一个迫切也不重要的问题,似乎更像是锻炼。

如何在特定时刻运行某个功能?越精确越好。

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

目前我有一个(几乎无穷无尽的)循环,它检查DateTime.Now,计算要睡觉的TimeSpan,睡觉为inverval - 30 s(如果那个间隔更大),再次以相同方式睡眠,然后调用功能

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

也许有一种更简单的方法可以说“在XX:00:00.000之间调用此功能”。

4 个答案:

答案 0 :(得分:2)

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

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

我不确定它是否应对待命事件......

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我只是睡一个较小的间隔(比如10秒,无论你想要的粒度如何),并确定队列中的下一个动作是否被安排运行(并运行它)。根据您的检查代码的效率,你可能会发现它需要相当多的CPU才能做到这一点。

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

答案 3 :(得分:0)

如果不需要编码,你可以使用windows的内置任务执行工具,你可以在控制面板中找到它。不知道具体的标题是什么......“计划任务”或者......你可以指定一个可执行文件,一个时间点如果我是对的你也可以指定某种重复。

我根本不确定这种方法对事件的确切程度......

当我必须实现这种类型的东西时,我使用System.Timers.Timer和TimeSpan(能够定义分辨率)做了一个方法。这种方法从来都不是很精确,但也不是必需的。为了获得更好的结果,也许在启动时你可以将这个计时器与当前系统时钟同步到一个“圆形”数字,然后,假设每15分钟设置一个间隔...

问候