Просто используйте однократный таймер. Если вы используете System.Timers.Timer, тогда установите для его свойства AutoReset значение false и используйте Start () в конце обработчика события Elapsed, чтобы перезапустить его, обычно в блоке finally. Если вы используете System.Threading.Timer, то создайте его с period of 0. Вызовите его метод Change () в обратном вызове, чтобы перезарядить его.
Особенно в случае System.Timers.Timer, очень важно, чтобы вы делали это таким образом. Не существует верхней границы для числа потоков пула потоков, которые он начнет вызывать для обработчика событий Elapsed. Если машина загружена, запуск может фактически занять некоторое время. С большим количеством возможностей для более чем одного, чтобы начать работать одновременно. И затрудняет остановку таймера.