Существует два основных способа ссылки на таймер, даже если вы не храните ссылку где-либо:
Пока таймер включен. Существует базовый System.Threading.Timer, который фактически генерирует событие. CLR хранит список активных таймеров, объект делегата обратного вызова сохраняет ссылки на Timer.
Обработчиком событий Elapsed, если он не является статическим. Это продлевает время жизни экземпляра Timer как минимум до времени жизни объекта класса, который содержит обработчик Elapsed.
Здесь нет режима отказа. Единственный возможный способ вернуть ссылку на таймер - использовать аргумент обработчика событий Elapsed sender . Если вы отключите таймер, то больше не будет способа получить ссылку, поэтому он подходит для собираемого объекта.
Довольно классический способ попасть в неприятности с этим Таймером и потерять события Elapsed - это когда для свойства AutoReset установлено значение false. Очень неприятная проблема заключается в том, что любые исключения, возникающие в обработчике событий Elapsed, проглатываются без какой-либо диагностики. Который будет обходить вызов вам придется перезапустить таймер в конце. Поддержите System.Threading.Timer, у него нет этой проблемы.