Этот таймер будет выпущен из памяти? - PullRequest
8 голосов
/ 25 февраля 2011

Рассмотрим эту пару функций в 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()
}

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

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

Спасибо!

Ответы [ 3 ]

7 голосов
/ 25 февраля 2011

Класс Threading.Dispatcher хранит список всех активных DispatcherTimers.Когда вы вызываете Stop () в обработчике событий Tick, таймер будет удален из этого списка.Больше нет ссылок на таймер.В конечном итоге это будет мусор.Что хорошо, потому что нет способа снова запустить таймер.В конце концов, у вас больше нет возможности получить ссылку, обработчик событий Tick был вашим последним выстрелом.

0 голосов
/ 23 марта 2013

По сути, DispatcherTimer порождает новый поток. Так что его область действия не может быть определена, как обычно, как мы думаем.В качестве альтернативы вы можете убить поток определенными методами.

0 голосов
/ 25 февраля 2011

Согласно этому , вам нужно будет вызвать stop и удалить обработчик.

...