Я хочу вызвать таймер обратного вызова только один раз, пока он не завершит задачу. Например, если интервал таймера составляет пять минут и задача может быть выполнена в течение 2-20 минут, если предыдущая задача не выполнена, новые потоки не вводят метод обратного вызова.
В настоящее время я делаю это с помощью летучего счетчика, но для меня это не имеет смысла. Должна быть лучшая практика. Пример кода:
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);
}