2015-08-28 3 views
1

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

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

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

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

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

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

Помощь!

+0

Попытка с помощью [Threading.Timer] (https://msdn.microsoft.com/en-us/library/system.threading.timer (v = vs.110) .aspx). Установите время цикла в бесконечность и только запустите таймер по методу обратного вызова –

ответ

2

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

1

Методы запуска и останова на таймере действительно работают в службе 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. 
     } 
} 
Смежные вопросы