2011-02-24 6 views
8

Рассмотрим эту пару функций в 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 секунд с тех пор, несмотря на то, я потерял ссылку на мой таймер, так как сфера его применения ограничена to func1(). Это означает, что таймер, очевидно, все еще находится в памяти, делая свою вещь, задолго до вызова func1(). Мой вопрос, если я добавлю это func2():

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

    ((DispatcherTimer)a).Stop() 
} 

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

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

Спасибо!

ответ

7

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

0

Согласно this, вам необходимо вызвать стоп и удалить обработчик.

0

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