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

时间:2009-06-15 20:13:34

标签: c# multithreading windows-services sleep

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

任何见解都将受到赞赏。

5 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:10)

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

当你的服务类的OnStop或OnShutdown方法被调用时,设置事件,这将导致WaitOne返回true,然后你可以退出你的工作线程。

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:6)

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

答案 4 :(得分:1)

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

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