Прошедшее по таймеру событие запускается дважды в программе командной строки C # - PullRequest
6 голосов
/ 23 июня 2011

Событие «Elapsed» моего таймера срабатывает дважды при запуске программы.Единственное назначение обработчика событий Elapsed - метод Main.Есть ли что-то, что я делаю не так?

//class level clock
public static System.Timers.Timer Clock;

static void Main(string[] args)
    {
       Clock = new System.Timers.Timer();
       Clock.Elapsed += new ElapsedEventHandler(Clock_Elapsed);
       Clock.AutoReset = false;
       Clock.Interval = timerInterval; //this needs to be in milliseconds!
       Clock.Enabled = true;

       //run infinite loop until q is pressed
       while (Console.Read() != 'q')
       {}
    }

static void Clock_Elapsed(object sender, ElapsedEventArgs e)
    {
    Clock.Stop();
    //do some stuff
    Clock.Start();             
     }

ОБНОВЛЕНИЕ:

Функция автоматического сброса, предоставленная @ fparadis2, дважды исправила стрельбу.Основная проблема заключалась в том, что мой интервал таймера был установлен на 30 миллисекунд вместо 30000 миллисекунд (30 секунд), чтобы событие имело двойной запуск.

Ответы [ 2 ]

13 голосов
/ 23 июня 2011

Если timerInverval достаточно мал, возможно, что событие Elapsed будет запущено дважды, прежде чем вы сможете остановить часы. Вы должны сделать

Clock.AutoReset = false;

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

Как указано в документации :

Если обработка события Elapsed длится дольше, чем Interval, событие может возникнуть снова в другом потоке ThreadPool. В этой ситуации обработчик события должен быть реентерабельным.

2 голосов
/ 23 июня 2011

Вы можете также рассмотреть возможность проверки этого паттерна .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...