Я создал службу Windows, которая должна проверять определенную таблицу в БД на новые строки каждые 60 секунд. Для каждой новой строки, которую я добавил, мне нужно выполнить тяжелую обработку на сервере, которая иногда может занимать более 60 секунд.
Я создал объект Timer в своем сервисе, который тикает каждые 60 секунд и вызывает нужный метод.
Поскольку я не хочу, чтобы этот таймер устанавливал галочку при обработке найденных новых строк, я обернул метод в блок lock { }
, поэтому он не будет доступен для другого потока.
Это выглядит примерно так:
Timer serviceTimer = new Timer();
serviceTimer.Interval = 60;
serviceTimer.Elapsed += new ElapsedEventHandler(serviceTimer_Elapsed);
serviceTimer.Start();
void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (this)
{
// do some heavy processing...
}
}
Теперь мне интересно -
Если мой таймер тикает и находит много новых строк в БД, и теперь обработка займет более 60 секунд, следующий тик не будет выполнять никакой обработки, пока предыдущий не закончится. Это тот эффект, который я хочу.
Но теперь метод serviceTimer_Elapsed немедленно отключится после завершения первой обработки или будет ждать, пока таймер снова не заработает.
Я хочу, чтобы это произошло - если обработка требует более 60 секунд, таймер заметит, что поток заблокирован, и подождите еще 60 секунд, чтобы проверить снова, чтобы я никогда не застрял в ситуации, когда есть очередь потоков, ожидающих завершения предыдущего.
Как мне достичь этого результата?
Какова лучшая практика для этого?
Спасибо!