【问题标题】:C# Windows Service Intermittent Method CallC# Windows 服务间歇方法调用
【发布时间】:2010-04-16 15:39:25
【问题描述】:

场景

我有一个 C# Windows 服务,它基本上订阅了一些事件,如果事件触发了任何事情,它会执行一些任务。

那个东西……

....这些事件是监控过程,我需要在一天中的某些时间重新启动。

问题

在准确的时间执行这项任务的最佳方式是什么?

目前的想法是:

1) 使用计时器每隔几分钟检查一次时间。 2) 不是计时器,也不是很糟糕的实现。

非常感谢您的帮助。

【问题讨论】:

    标签: c# windows-services timer


    【解决方案1】:

    在服务开始时使用 IsBackground = true 启动一个新线程。这可以确保您的线程在您的服务停止时终止,因此您可以简单地启动并忘记它。

    在线程中,使用 Thread.Sleep(60*1000) 的无限循环,等待一天中正确的时间重新启动。重新启动可能应该在一个新线程上完成,并且 IsBackground = false 以防止您的服务在您的应用程序完成重新启动之前停止(Windows 允许您关闭服务的时间限制为 30 秒左右)。或者,您可以为重新启动操作生成一个单独的进程。

    【讨论】:

      【解决方案2】:

      您可以设置在一天中特定时间运行的计时器,但我可能更喜欢以下方法。

      while (!closing)
      {
      if (SomethingNeedsDoingNow()) { DoIt(); }
      
      Thread.Sleep(1);
      }
      

      这几乎不会消耗任何资源,然后可以在一天中的任何时间轻松触发事件,达到 1 秒的粒度。

      注意SomethingNeedsDoingNow 应该检查当前时间,看看是否有任何事件需要触发。如果你能以更宽松的粒度逃脱,那么你可以睡 60 秒。

      【讨论】:

        【解决方案3】:

        如果您真的想避免实现计时器,一个选项是 Windows 计划任务,它会在触发时终止您的已处理任务。

        然后您可以让您的服务不断轮询以确保进程正在运行,如果没有启动它们。

        仍然是一种“计时器-y”,但这是另一种方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 2012-06-30
          相关资源
          最近更新 更多