Рассмотрим эту пару функций в 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()
}
, таймер будет активирован сборкой мусора вскоре после этого, или он будет продолжать оставаться в памяти, пока программа не завершится? Если он остается в памяти, как я могу пометить его для сбора вручную (или сделать что-то подобное)?
Второй вопрос, который у меня есть (если вы чувствуете желание ответить), - будет ли обычный таймер вести себя точно так же в этом случае? ситуация или есть существенная разница, о которой я должен знать.
Спасибо!