【问题标题】:Using Thread.Sleep() in a Windows Service在 Windows 服务中使用 Thread.Sleep()
【发布时间】:2009-06-15 20:13:34
【问题描述】:

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

任何见解将不胜感激。

【问题讨论】:

    标签: c# multithreading windows-services sleep


    【解决方案1】:

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

    如果间隔范围很广且有规律,您也可以安排它。但是,如果您谈论的是长的、不一致的间隔,那么是的,Timer 会更好。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          【解决方案4】:

          您不应该预先计算如此大量的时间和几个小时的睡眠时间。最多睡一分钟,然后醒来重新计算时间,再睡一分钟。我认为计算非常便宜,或者可以通过缓存变得非常便宜。我的建议试图缓解的问题是计算机时钟出奇地“跳跃”,主要是由于网络时间服务纠正了时间漂移,也因为夏令时,尤其是因为用户调整了时钟。因此,最好在如此长的时间间隔内不断地重新计算时间,即使这意味着每分钟左右醒来。如果您在“过去”中醒来,请不要感到惊讶(即不要断言),时钟可以及时调整。

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-11-12
              • 2011-01-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-23
              • 2014-06-24
              相关资源
              最近更新 更多