Вопрос о дизайне обратного вызова атомного таймера - PullRequest
1 голос
/ 03 мая 2011

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

1 Ответ

3 голосов
/ 03 мая 2011

Это достаточно просто на самом деле.Когда вы инициализируете таймер, установите для свойства AutoReset значение false.

_timer.AutoReset = false;

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

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