Таймер, событие и сборка "мусора": я пропускаю что-то?

Рассмотрите следующий код:

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: это не реальная программа, конечно, я просто пытался подтвердить точку зрения кому-то..., но мое доказательство не работало;)

15
задан Thomas Levesque 22 February 2010 в 13:13
поделиться

1 ответ

Хорошо, я думаю, что знаю, что происходит... Я посмотрел код класса Timer с помощью Reflector, и нашел следующую инструкцию в сеттере свойства Enabled :

this.timerRoot = GCHandle.Alloc(this);

Итак, при запуске таймер выделяет для себя GCHandle, что предотвращает его сбор GC...

21
ответ дан 1 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: