Как приостановить System.Timer в Visual Basic?

Я использую system.timer в службе Windows для запуска процесса, который обычно превышает интервал таймера. Я пытаюсь не дать таймеру запускать один и тот же код более одного раза, известная проблема с system.timers.

Что я хочу: таймер запускает мой код, но таймер «останавливается», чтобы дождаться завершения кода, прежде чем возобновить тики.

У меня две проблемы:

  1. Способ работы system.timers заключается в том, что таймер создаст для вас состояние гонки, запустив новые избыточные потоки того же кода и накапливая их на вас, если они не завершились к тому времени, когда истек интервал таймера.

  2. Я бы запустил/остановил таймер, чтобы этого не произошло, но с помощью System.Timers.Timer, как только вы остановите таймер для завершения обработки, он никогда не вернется - я никогда не мог перезапускать таймер после того, как он был остановлен, он был уничтожен и, вероятно, собран. Включение/отключение — это то же самое, что запуск/остановка с теми же результатами.

Как удержать system.timer от запуска новых избыточных потоков одного и того же кода, если процесс не завершился к моменту истечения интервала таймера? Очевидно, что запуск/остановка (включение/выключение) таймера НЕ является решением, так как он не работает.

Помощь!


person R. Hodges    schedule 28.08.2015    source источник


Ответы (2)


Запустите свой таймер, когда он должен запуститься, запустите другой поток, чтобы выполнить работу, после чего таймер можно остановить. Таймеру все равно, завершилась ли нить или убежала с призовым фондом. Используйте библиотеку параллельных задач (TPL) для наиболее эффективного использования.

person Tertius Geldenhuys    schedule 28.08.2015

Методы запуска и остановки таймера действительно работают в службе Windows. У меня есть несколько производственных сервисов, которые используют код, который делает это, за исключением того, что мой код написан на C#.

Однако убедитесь, что вы используете System.Timers.Timer, а не Windows.Forms.Timer.

Вот краткий пример C#/псевдокода того, как выглядят мои сервисы.

// this is the OnStart() event which fires when windows svc is started
private void OnStart()
{
    // start your timer here.
    MainTimer.Start();
}

private void ElapsedEventHandler()
{
      try
      { 
          // Stop the timer, first thing so the problem of another timer
          // entering this code does not occur
          MainTimer.Stop();

          //Do work here...   
      }
      catch (Exception ex)
      { 
          // if you need to handle any exceptions - write to log etc.
      }
      finally
      {
         MainTimer.Start();
         // finally clause always runs and will insure
         // your timer is always restarted.
      }
}
person raddevus    schedule 28.08.2015