Как стрелять System.Timers.Timer только один раз - PullRequest
1 голос
/ 24 ноября 2011

Я создаю WindowsService с привязкой Timer к EventHandler с бесконечным циклом; Я хочу иметь возможность запустить этот таймер один раз в методе OnStart () службы, а затем остановить таймер в OnStop () службы. Как я могу заставить Таймер срабатывать только один раз?

Кроме того, это лучший дизайн для управления бесконечными циклами в WindowsService? Будет ли лучше обрабатывать его внутри другого потока (возможно, фонового потока)?

Ответы [ 2 ]

3 голосов
/ 24 ноября 2011

Будет ли лучше обрабатывать его внутри другого потока (возможно, фонового потока)?

Да.Это звучит так, как будто вам лучше использовать один фоновый поток вместо таймера.Поток может переходить в состояние вашего цикла, пока вы не сообщите, что пора выходить (в методе OnStop).

Новая поддержка отмены в .NET 4 обеспечивает довольно чистый способ"отменить" свой бесконечный цикл ...

1 голос
/ 24 ноября 2011

Вам будет лучше использовать выделенный рабочий поток для этого бесконечного цикла.Если вы используете какой-либо тип сигнального механизма, например 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();
  }
}

Хорошая особенность этого шаблона в том, что вы можете установить параметр timeoutна WaitOne для настройки времени ожидания цикла между итерациями.По сути, это дает вам тот же эффект, что и мой таймер.

...