#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
экземпляр.