/ / Este temporizador será liberado da memória? - c #, .net, coleta de lixo, dispatchertimer

Este temporizador será liberado da memória? - c #, .net, coleta de lixo, dispatchertimer

Considere este par de funções em 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
}

Depois de chamar func1 () uma vez, func2 () é chamadoa cada 5 segundos a partir de então, embora eu perca a referência ao meu timer, já que seu escopo é restrito a func1 (). Isso significa que o temporizador obviamente ainda está na memória, fazendo sua coisa, muito tempo depois que o func1 () foi chamado. Minha pergunta é, se eu adicionar isso ao func2 ():

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

((DispatcherTimer)a).Stop()
}

o temporizador será escolhido pela coleta de lixo?logo depois, ou continuará a permanecer na memória até que o programa saia? Se permanecer na memória, como posso marcá-lo manualmente para a coleta (ou fazer algo semelhante)?

Uma pergunta secundária que tenho (se você se sente inclinado a responder) é se um Timer regular teria exatamente o mesmo comportamento nessa situação ou se há uma diferença significativa que eu deveria saber.

Obrigado!

Respostas:

7 para resposta № 1

O encadeamentoA classe Dispatcher mantém uma lista de todos os DispatcherTimers ativos. Quando você chama Stop () no manipulador de eventos Tick, o cronômetro será removido dessa lista. Agora não há mais referências ao cronômetro. Será eventualmente coletado lixo. O que é bom porque não há como fazer o cronômetro iniciar novamente. Afinal, você don "t tem alguma maneira de obter a referência mais, o manipulador de eventos Tick foi sua última chance.


0 para resposta № 2

De acordo com esta, você terá que chamar parar e remover o manipulador.


0 para resposta № 3

Basicamente, um DispatcherTimer gera um novo Thread.So seu escopo não pode ser definido como normalmente pensamos. Você pode, alternativamente, matar o thread por métodos específicos.