为什么是线程?长时间的睡眠是不精确的

本文关键字:不精确 长时间 线程 为什么 | 更新日期: 2023-09-27 18:10:17

我有一个用c#编写的服务。服务是全天候活动的,但有一个线程通过thread休眠。睡到预定的时间——通常是晚上9点到11点——做一些家务。当服务第一次启动时,它计算时间跨度(以毫秒为单位),直到整理时间,并调用Thread。利用这段时间睡觉。下一次,线程只需调用thread . sleep(24*60*60*1000)来睡眠24小时。

它工作得很好,除了一个单安装当睡眠唤醒几分钟- 5-8分钟根据跟踪日志。几个星期后,打扫房间的时间会变化几个小时。我可以期待家务时间可以向前移动,而不是向后移动。不知道有没有人能解释一下。我必须承认,我不是在寻找一个不同的解决方案来解决这个问题,只是试图解释这种行为。

为什么是线程?长时间的睡眠是不精确的

线程。睡眠不像你现在这样适合长时间的精确睡眠。您应该使用System.Threading.Timer之类的东西。你可以设置它的第一次运行时间为午夜,并让它每24小时响一次。Timer(TimerCallback, Object, TimeSpan, TimeSpan)构造函数正是您要找的。

Sleep不使用挂钟计算时间。它使用有规律的中断间隔,大约每隔10ms(可调,取决于操作系统版本)。用于这些中断的时间源是廉价的石英,历史上用于一些其他功能,因此其频率既不完全是1/10ms,又从一台机器波动到另一台机器。

解决你的问题的正确方法是睡得更短,并检查是否真的到了该醒来的时间。

另外,这里希望当您说您正在使用Sleep()时,实际上您正在等待一个带有超时的事件