任务计划程序提前几毫秒运行任务

3

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

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上,如果是家庭版本我可以接受,但在生产环境中不行。

为什么会出现这种情况?这是一个bug吗?我该如何防止这种情况发生?


好的,我可以做到,但为什么会发生这种情况呢? - kosnkov
1
这里有一个类似的问题在SU上:为什么Windows任务计划程序提前启动我的任务?如果我猜的话,我会说这是与计时器精度受限有关的问题。 - mishmash
86毫秒是很快的。预定任务和接收应用程序是否在同一台机器上? - Shyamal Desai
我认为这是因为Windows操作系统不是实时操作系统。 - default
这里有一个类似的帖子(http://stackoverflow.com/questions/9891879/c-sharp-timer-for-millisecond-waits),也有一个答案。 - default
显示剩余3条评论
1个回答

5

请查看Eric Lippert关于DateTime的精度或者缺乏精度的文章。链接在这里。

文章中的关键段落:

简而言之,“现在是几点?”这个问题应该只回答反映在系统内部的准确度水平的程度。大多数计算机时钟甚至没有精确同步到官方时间的毫秒级别,因此超过这个准确度水平的精度是虚假的。我认为DateTime结构体表面上显示了它所具有的精度,这相当不幸,因为它使得操作这个结构体的操作似乎也应该具有那个级别的精度。但是它们几乎肯定没有那么精确。

如果你真的需要定时器在午夜之前触发而不是更早,那么你将不得不强制设置一个“稍微”未来的日期/时间,正如评论中已经建议的那样。你真的没有比这更多的控制权。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接