Я создал службу Windows, которая должна проверять определенную таблицу в db для новых строк каждые 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...
}
}
Теперь мне интересно -
Если мой таймер тикает и находит много новых строк на db, и теперь обработка займет более 60 секунд, следующий тик не будет обрабатывать до завершения предыдущего. Это тот эффект, который я хочу.
Но теперь будет ли метод serviceTimer_Elapsed отключен сразу после завершения первой обработки или будет ждать, пока таймер снова отметит.
Я хочу, чтобы это произошло - если для обработки требуется более 60 секунд, чем таймер заметит, что поток заблокирован, и подождите еще 60 секунд, чтобы снова проверить, чтобы я никогда не застрял в ситуации, когда есть очередь потоков, ожидающих завершения предыдущего.
Как я могу выполнить этот результат?
Какова наилучшая практика для этого?
Спасибо!