为什么Thread.Sleep在长时间内不准确?

时间:2011-09-30 06:13:10

标签: c# multithreading

我有一个用C#编写的服务。服务全天候是活动的,但是一个线程通过Thread.Sleep睡眠直到预定时间 - 通常是晚上9点到晚上11点 - 来执行一些内务处理任务。首次启动服务时,它会计算时间跨度,以毫秒为单位直到内务处理时间,并使用该时间跨度调用Thread.Sleep。下次线程只需调用Thread.Sleep(24 * 60 * 60 * 1000)即可24小时休眠。

除了单次安装,睡眠时间提前几分钟 - 根据跟踪日志提前5-8分钟,它的工作正常。几个星期后,家政服务时间会变化几个小时。我可以预期,看家时间可以向前移动 - 而不是向后移动。想知道是否有人可以得到解释。我必须承认,我并不是在寻找解决问题的不同解决方案 - 只是试图解释这种行为。

2 个答案:

答案 0 :(得分:10)

Thread.Sleep不是像你一样设计用于长时间准确的睡眠。你应该使用像System.Threading.Timer这样的东西。你可以给它一个午夜的第一个运行时间,并让它每24小时运行一次。 Timer(TimerCallback, Object, TimeSpan, TimeSpan)构造函数正是您正在寻找的。

答案 1 :(得分:4)

睡眠不使用挂钟进行时间计算。它使用常规的中断间隔,大约每10ms(可调节和OS版本相关)为此。用于这些中断的时间源是廉价的石英,历史上用于其他一些功能,所以它的频率不是1 / 10ms,而是从一台机器到另一台机器的波动。

解决问题的正确方法是在更短的时间内睡觉,并检查时间是否真的醒来。

此外,这里希望当你说你正在使用Sleep()时,实际上你正在等待一个超时的事件。