/ / Czy ten licznik czasu zostanie zwolniony z pamięci? - c #, .net, odśmiecanie, dispatchertimer

Czy ten Timer zostanie zwolniony z pamięci? - c #, .net, garbage-collection, dispatchertimer

Rozważ tę parę funkcji w języku 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
}

Po jednokrotnym wywołaniu func1 () wywoływana jest func2 ()co 5 sekund od tego momentu, mimo że tracę odniesienie do mojego timera, ponieważ jego zakres jest ograniczony do func1 (). Oznacza to, że licznik jest oczywiście nadal w pamięci i robi swoje, długo po wywołaniu func1 (). Moje pytanie brzmi: jeśli dodam to do func2 ():

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

((DispatcherTimer)a).Stop()
}

czy licznik czasu zostanie odebrany przez zbieranie śmieciwkrótce potem, czy pozostanie w pamięci aż do zakończenia programu? Jeśli pozostanie w pamięci, jak mogę oznaczyć go ręcznie do kolekcji (lub zrobić coś podobnego)?

Drugie pytanie, które mam (jeśli czujesz skłonność do odpowiedzi), brzmi: czy zwykły Timer zachowałby się dokładnie tak samo w tej sytuacji lub czy istnieje znacząca różnica, o której powinienem wiedzieć.

Dzięki!

Odpowiedzi:

7 dla odpowiedzi № 1

Wątek.Klasa Dispatcher prowadzi listę wszystkich aktywnych DispatcherTimerów. Gdy wywołasz Stop () w module obsługi zdarzeń Tick, wówczas timer zostanie usunięty z tej listy. Nie ma już żadnych odniesień do timera. W końcu zostaną zebrane śmieci. Co jest w porządku, ponieważ nie ma możliwości ponownego uruchomienia stopera. W końcu nie masz już żadnego sposobu na uzyskanie referencji, obsługa zdarzeń Tick była Twoim ostatnim strzałem w nią.


0 dla odpowiedzi nr 2

Według to, będziesz musiał wywołać stop i usunąć program obsługi.


0 dla odpowiedzi № 3

Zasadniczo DispatcherTimer odradza nowy wątek, więc jego zakresu nie można zdefiniować w normalny sposób. Możesz alternatywnie zabić wątek za pomocą określonych metod.