【问题标题】:How to fire System.Timers.Timer only once如何只触发一次 System.Timers.Timer
【发布时间】:2012-01-05 03:58:24
【问题描述】:

我正在创建一个 WindowsService,它有一个 Timer 绑定到一个具有无限循环的 EventHandler;我希望能够在服务的 OnStart() 方法中触发此 Timer,然后在服务的 OnStop() 中停止 Timer。如何强制定时器只触发一次?

另外,这是在 WindowsService 中控制无限循环的最佳设计吗?在另一个线程(可能是后台线程)中处理它会更好吗?

【问题讨论】:

    标签: multithreading windows-services timer infinite-loop


    【解决方案1】:

    在另一个线程(可能是后台线程)中处理它会更好吗?

    是的。这听起来你最好使用单个后台线程而不是计时器。线程可以进入你的循环状态,直到你发出退出的信号(在OnStop 方法中)。

    新的Cancellation support in .NET 4 提供了一种相当简洁的方式来“取消”你的无限循环...

    【讨论】:

    • 谢谢 Reed,是的,我刚刚结束了使用后台线程;有一次 Timer 火灾似乎是对 Timer 的滥用 :)
    【解决方案2】:

    您最好为该无限循环使用专用的工作线程。如果您使用某种类型的信号机制(例如 ManualResetEvent)来限制循环,那么您也可以使其停止。

    public class YourService : ServiceBase
    {
      private ManualResetEvent StopRequested = new ManualResetEvent(false);
    
      protected override void OnStart(string[] args)
      {
        new Thread(
          () =>
          {
            while (!StopRequested.WaitOne(0))
            {
              // Infinite loop code goes here.
            }
          }).Start();
      }
    
      protected override void OnStop()
      {
        StopRequested.Set();
      }
    }
    

    这种模式的好处是您可以在WaitOne 上设置超时参数来调整循环在迭代之间等待的时间。这基本上会给你和我定时器一样的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 2015-07-30
      • 2012-02-23
      • 2020-07-23
      • 2021-03-22
      • 2015-09-07
      • 2016-11-10
      • 2016-01-19
      相关资源
      最近更新 更多