Нет.Вам не нужно прятать свой таймер.Обычно это сборщик мусора, поскольку на него ссылается только ваш делегат.Тем не менее, я считаю, что конструктор Timer
помещает ссылку в базовую среду выполнения, поэтому с вами все будет в порядке.
Эрик Липперт, вероятно, что-то скажет в своем блоге: Реализация анонимных методовв C # и его последствиях (часть 1)
Ваша Timer
переменная t
будет оставаться доступной, пока есть ссылка на ваш анонимный метод.На ваш анонимный метод будут ссылаться до тех пор, пока не сработает событие.По крайней мере, так долго.
Согласно Эрику Липперту, компилятор c # превращает ваш код во что-то другое, причем контекст вашего метода (включая указатель this
включающего объекта) весь в своем собственноммаленький сгенерированный компилятором класс.Так что, похоже, сам анонимный метод (или делегат) содержит ссылку на таймер.
О, и все остальные в этом потоке правы: я просто выполнил некоторые вещи (и узнал о том, как обрабатывает компилятор C #)анонимные методы одновременно).
Так что да, у вас есть циклическая ссылка.Но я почти уверен, что создание таймера должно подключить его где-нибудь в среде выполнения / окнах.Давайте проверим.
Используя Reflector, вы можете следовать по следу от System.Timer.Timer()
до TimerBase
, который имеет метод extern AddTimerNative
.Я не уверен, как заглянуть в это, но я держу пари, что он регистрирует ваш таймер в ОС.
Вывод: Ваш таймер не выйдет из области видимости, так какна него будет ссылаться ОС, пока он не сработает.