我正在编写一个需要长时间睡眠的 Windows 服务(15 小时是最长的睡眠时间,30 分钟是最短的睡眠时间)。我目前正在使用Thread.Sleep(calculatedTime)将我的代码置于睡眠模式。Thread.Sleep 是最好的选择还是我应该使用计时器?我已经在谷歌上搜索了一段时间,找不到简洁的答案。由于这是一个windows服务,我不必担心锁定UI,所以我想不出不使用Thread.Sleep的理由。
任何见解将不胜感激。
我正在编写一个需要长时间睡眠的 Windows 服务(15 小时是最长的睡眠时间,30 分钟是最短的睡眠时间)。我目前正在使用Thread.Sleep(calculatedTime)将我的代码置于睡眠模式。Thread.Sleep 是最好的选择还是我应该使用计时器?我已经在谷歌上搜索了一段时间,找不到简洁的答案。由于这是一个windows服务,我不必担心锁定UI,所以我想不出不使用Thread.Sleep的理由。
任何见解将不胜感激。
我会使用一个计时器,Thread.Sleep,它可能会导致一个阻止服务关闭的阻塞部分。
如果间隔范围很广,而且很规律,你也可以安排它。但是,如果您谈论的是长的、不一致的间隔,那么是的,Timer 会更好。
由于服务控制管理器可能随时要求停止服务,因此您的线程应始终准备好响应这些请求,因此您不应使用 Thread.Sleep()。相反,在主线程中创建一个手动重置事件,并在工作线程中使用它的 WaitOne 方法超时。WaitOne 将在时间到期时返回 false。
调用服务类的 OnStop 或 OnShutdown 方法时,设置事件,这将导致 WaitOne 返回 true,然后您可以退出工作线程。
Thread.Sleep()
在很多情况下使用它通常被认为是不好的做法。
如果您希望服务在后台运行,您应该使用计时器。
如果该服务只需要按计划的时间间隔运行,我建议您考虑使用 Windows 任务调度程序以允许 Windows 在您需要时运行应用程序。
您不应该预先计算如此大量的时间并睡几个小时。最多睡一分钟,然后醒来重新计算时间,再睡一分钟。我认为计算非常便宜,或者可以通过缓存变得非常便宜。我的建议试图缓解的问题是计算机时钟出奇地“跳跃”,这主要是由于网络时间服务纠正了时间漂移,也因为夏令时,尤其是因为用户调整了时钟。因此,最好不断地重新计算如此长的时间间隔,即使这意味着每分钟左右醒来。如果您在“过去”中醒来,请不要感到惊讶(即不要断言),时钟可以及时调整。
要考虑的另一件事是线程是有限的资源,每个线程为其堆栈消耗一部分内存(1MB?)。它们还可能增加调度程序的负载。
现在,如果您的服务没有做太多其他事情,那么浪费的空间是微不足道的,但是在开始分配多个线程之前意识到这一点是明智的。使用 ThreadPool 和/或 Timers 效率更高。