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 № 1Wą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.