Вопрос о разработке обратного вызова атомарного таймера

#c# #timer #callback

#c# #таймер #обратный вызов

Вопрос:

Я хочу вызвать обратный вызов таймера только один раз, пока он не завершит задачу. Например, если интервал таймера равен пяти минутам, и задача может быть выполнена в течение 2-20 минут, если предыдущая задача не завершена, new threads не вводит метод обратного вызова.

В настоящее время я делаю это с помощью счетчика volatile, но для меня это не имеет смысла. Должна быть лучшая практика. Пример кода:

 private volatile int _counter = 0;
private readonly object _syncLock = new object();

void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    lock(syncLock)
    {
        if (_counter > 0)
            return;
        else
            Interlocked.Increment(ref _counter);
    }

    // Method body

    Interlocked.Decrement(ref _counter);
}
  

Комментарии:

1.Вам не нужны lock и Interlocked

2. @Henk: без этого многие потоки будут вводить метод. Фактический интервал представляет собой небольшое значение.

3. Я думал, это были минуты. Но даже тогда вам нужен монитор, моя ошибка.

Ответ №1:

На самом деле это достаточно просто. При инициализации таймера установите для AutoReset свойства значение false.

 _timer.AutoReset = false;
  

Затем в конце вашего обработчика событий вызовите это:

 _timer.Start();
  

Комментарии:

1. Это были бы таймеры. Таймер, обработка потоков. Таймер не имеет автоматической настройки.

2. @Henk — Изучив параметры обработчика событий, я пришел к выводу, что на самом деле это был System.Timers.Timer экземпляр.