У меня есть служба Windows (.NET 4), которая периодически обрабатывает очередь, например каждые 15 минут. Я использую System.Threading.Timer
, который устанавливается, когда служба запускает обратный вызов каждые X миллисекунд. Обычно каждый запуск занимает несколько секунд и никогда не сталкивается, но что, если я не могу этого принять, - тогда я хочу, чтобы следующий запуск был немедленно завершен, если обработка выполняется.Монитор, замок или энергозависимый?
Это легко решить с помощью блокировки, volatile bool или монитора, но что на самом деле целесообразно использовать в этом сценарии или просто предпочтительный вариант в целом?
Я нашел другие сообщения, которые отвечают почти на этот сценарий (например, Volatile vs. Interlocked vs. lock), но для этого нужно несколько советов по расширению этого примера Timer с немедленным выходом.
+1, лучше предотвратить перекрытие в первую очередь. Но не следует ли это сочетать с * отключением * таймера полностью в * начале * обработки, используя 'timer.Change (Timeout.Infinite, Timeout.Infinite)'? – shambulator
@shambulator: +1 для отключения таймера в начале событияHandler. Как правило, что-то вроде «timer.Change (Timeout.Infinite, Timeout.Infinite)» при запуске и в конце обработчика событий (после цикла обработки) восстанавливает таймер в его исходное состояние. –
@shambulator: таймер * отключен в начале обработки. Передача 'Timeout.Infinite' в качестве параметра' period' приведет к срабатыванию таймера только один раз, поэтому после запуска делегата таймер уже * отключен *. –