Как поднять только 1 событие таймера в C #? - PullRequest
3 голосов
/ 04 августа 2010

Как получить событие таймера для запуска по одному. Например, у меня есть таймер, который вызывает событие каждые 10 минут. Возникающее событие занимает 10 или более минут, чтобы завершить выполнение. Я хотел бы сбросить таймер ПОСЛЕ того, как событие закончилось. Другими словами, я не хочу поднимать более одного экземпляра события одновременно.

Ответы [ 3 ]

14 голосов
/ 04 августа 2010

Используйте System.Timers.Timer, а не Threading

Установите для AutoReset значение false.

Тогда запустите его снова, когда закончите.

6 голосов
/ 04 августа 2010

Обычно я делаю, чтобы мое событие останавливало таймер, когда оно поднялось, и затем перезапускало таймер, когда процесс события завершался:

private void timerHandler(object sender, TimerElapsedEventArgs e)
{
    Timer timer = (Timer)sender;
    timer.Stop();
    RunProcess();
    timer.Start();
}

public void RunProcess()
{
    /* Do stuff that takes longer than my timer interval */
}

Теперь мой таймер снова запустится после завершения процесса

0 голосов
/ 04 августа 2010

Может быть трудно остановить таймеры для эффективности или логики. Следующий код синхронизирует пропуск событий.

static readonly object key = new object();

void TimerHandler(object sender, TimerElapsedEventArgs e)
{
  if(Monitor.TryEnter(key))
  {
    try
    {
      //do your stuff
    }
    finally
    {
      Montitor.Exit(key);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...