在Windows服务中使用Thread.Sleep()

我正在写一个需要长时间睡眠的Windows服务(15小时是最长的睡眠,30分钟是最短的)。 我目前正在使用Thread.Sleep(calculatedTime)将我的代码置于睡眠模式。 Thread.Sleep是最佳选择还是应该使用计时器? 我一直在谷歌上搜索一段时间,但找不到简洁的答案。 由于这是一个Windows服务,我不必担心锁定UI,所以我想不出不使用Thread.Sleep的原因。

任何见解将不胜感激。

我会使用一个计时器Thread.Sleep,可能导致阻止服务关闭的阻塞。

如果间隔是广泛的,并且是常规的,您也可以只安排它。 但是如果你谈论的是长而不一致的时间间隔,那么定时器会更好。

由于服务控制管理器可能会要求服务随时停止,因此您的线程应始终准备好响应这些请求,因此不应使用Thread.Sleep()。 相反,在主线程中创建一个手动重置事件,并使用其WaitOne方法在工作线程中超时。 当时间到期时,WaitOne将返回false。

调用服务类的OnStop或OnShutdown方法时,设置事件并使WaitOne返回true,然后退出工作线程。

在很多情况下,通常认为使用Thread.Sleep()是不好的做法。

如果您希望服务在后台运行,则应使用计时器。

如果服务只需要按计划的时间间隔运行,我建议您考虑使用Windows任务计划程序,以允许Windows在您需要时运行该应用程序。

你不应该预先计算这么长的时间并且睡几个小时。 最好睡一分钟,然后醒来并重新计算时间,再睡一分钟。 我假设计算非常便宜,或者可以通过缓存使其非常便宜。 我的建议试图缓解的问题是计算机时钟令人惊讶地“跳跃”,主要是由于网络时间服务纠正了时间偏差,也是因为节省了日光,尤其是因为用户调整时钟。 因此,最好不断地重新计算这么长时间间隔的时间,即使这意味着每分钟都会醒来。 如果你在’过去’醒来,时钟可以及时调整,不要感到惊讶(即不断言)。

另一件需要考虑的事情是线程是有限的资源,每个线程为其堆栈消耗一部分内存(1MB?)。 它们还可能增加调度程序的负载。

现在,如果您的服务没有做太多其他浪费的空间是微不足道的,但在开始分配多个线程之前明智地注意这一点。 使用ThreadPool和/或Timers效率更高。