Рассмотрите следующий код:
class TestTimerGC : Form
{
public TestTimerGC()
{
Button btnGC = new Button();
btnGC.Text = "GC";
btnGC.Click += (sender, e) => GC.Collect();
this.Controls.Add(btnGC);
System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();
tmr.Interval = 1000;
tmr.Tick += (sender, e) => this.Text = DateTime.Now.ToString();
tmr.Start();
}
}
Если я не ошибаюсь, после tmr
переменная выходит из объема, Timer
не ссылается нигде, таким образом, это должно иметь право на сборку "мусора". Но когда я нажимаю кнопку GC, таймер продолжает работать, таким образом, я предполагаю, что это не было собрано...
У кого-либо есть объяснение этого?
PS: это не реальная программа, конечно, я просто пытался подтвердить точку зрения кому-то..., но мое доказательство не работало;)
Хорошо, я думаю, что знаю, что происходит... Я посмотрел код класса Timer
с помощью Reflector, и нашел следующую инструкцию в сеттере свойства Enabled
:
this.timerRoot = GCHandle.Alloc(this);
Итак, при запуске таймер выделяет для себя GCHandle
, что предотвращает его сбор GC...