Будет ли этот таймер освобожден из памяти?

Рассмотрим эту пару функций в C #:

void func1() {
    DispatcherTimer tmr = new DispatcherTimer();
    tmr.Interval = TimeSpan.FromSeconds(5);
    tmr.Tick += func2;
    tmr.Start();
}

void func2(object a, EventArgs b) {
    // Called every 5 seconds once func1() is called
}

После однократного вызова func1 (), func2 () вызывается каждые 5 секунд с этого момента, даже если я теряю ссылку на свой таймер, так как его область видимости ограничивается функцией func1 (). Это означает, что таймер, очевидно, все еще находится в памяти и делает свое дело спустя долгое время после вызова func1 (). У меня вопрос: если я добавлю это в func2 ():

void func2(object a, EventArgs b) {
    // Called every 5 seconds once func1() is called

    ((DispatcherTimer)a).Stop()
}

, таймер будет активирован сборкой мусора вскоре после этого, или он будет продолжать оставаться в памяти, пока программа не завершится? Если он остается в памяти, как я могу пометить его для сбора вручную (или сделать что-то подобное)?

Второй вопрос, который у меня есть (если вы чувствуете желание ответить), - будет ли обычный таймер вести себя точно так же в этом случае? ситуация или есть существенная разница, о которой я должен знать.

Спасибо!

8
задан JoeCool 24 February 2011 в 22:10
поделиться