如何只触发一次System.Timers.Timer

时间:2011-11-23 21:27:39

标签: multithreading windows-services timer infinite-loop

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

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

答案 1 :(得分:1)

对于无限循环,使用专用工作线程会更好。如果使用某种类型的信号机制(如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上设置超时参数来调整循环在迭代之间等待的时间。这基本上会给你与我计时器相同的效果。