任务调度程序运行任务过早几毫秒

Posted

技术标签:

【中文标题】任务调度程序运行任务过早几毫秒【英文标题】:Task scheduler run task few milliseconds too early 【发布时间】:2016-02-19 11:33:41 【问题描述】:

我有一个带触发器的任务:

At 0:00 every day - after triggered, repeat every 1 hours for a duration of 1 day.

在我的应用程序中,我以这种方式读取时间:

dateTimeUtcNow = DateTime.Now;

有时,非常罕见,dateTimeUtcNow 会在整小时前几毫秒显示时间,例如 2015-11-11 14:59:59,914

服务器在 Windows Server 2012 R2 上运行,我可以在家庭版上接受这个,但不能在生产版上接受。

为什么?这是一个错误吗?我怎样才能防止这种情况发生?

【问题讨论】:

例如将触发器更改为 0:01 而不是 0:00? 好的我可以做到,但是为什么会发生呢? 这里有一个关于 SU 的类似问题:Why is Windows Task Scheduler starting my tasks early? 如果我不得不猜测,我会说这是计时器准确性受到限制的问题。 @shurik 这会使它在工作时运行迟到。最好检查当前时间是否是您想要的,并在需要时重新安排/睡眠。 86 毫秒要快得多。计划任务和接收应用在同一台机器上吗? 【参考方案1】:

查看 Eric Lippert 的文章,了解 DateTime 的准确性,或者说缺乏准确性。 Link here.

文章的关键段落:

简而言之,“现在几点了?”这个问题。真的应该只是 回答到反映准确度水平的准确度水平 系统中固有的。大多数计算机时钟不准确 甚至在官方时间的一毫秒内同步,并且 因此,超出该精度水平的精度是谎言。它是 在我看来,相当不幸的是,DateTime 结构确实 表面尽可能精确,因为它看起来像 该结构上的操作也应该准确到该级别。 但几乎可以肯定,它们并不那么准确。

如果您真的需要计时器在午夜之前而不是更早关闭,那么您将不得不强制“稍微”未来的日期/时间,正如 cmets 中已经建议的那样。你真的没有比这更多的控制权了。

【讨论】:

以上是关于任务调度程序运行任务过早几毫秒的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows Server 启动时自动运行程序

进程调度是的任务是啥

执行任务后气流调度程序似乎没有运行

我的脚本不会在任务调度程序下运行。为啥?

任务调度程序 - 仅针对特定任务的事件运行

bcp 未从任务调度程序运行