Wird dieser Timer aus dem Speicher freigegeben?

8

Betrachten Sie dieses Funktionspaar in C #:

%Vor%

Nachdem func1 () einmal aufgerufen wurde, wird func2 () von da an alle 5 Sekunden aufgerufen, obwohl ich den Verweis auf meinen Timer verliere, da sein Bereich auf func1 () beschränkt ist. Das bedeutet, dass der Timer offensichtlich noch im Speicher ist und seine Funktion ausführt, lange nachdem func1 () aufgerufen wurde. Meine Frage ist, wenn ich das zu func2 () hinzufügen:

%Vor%

Wird der Timer kurz danach von der Garbage-Collection übernommen, oder bleibt er bis zum Programmende im Speicher? Wenn es im Speicher bleibt, wie kann ich es für die Sammlung manuell markieren (oder etwas ähnliches tun)?

Eine zweite Frage, die ich habe (wenn Sie geneigt sind zu antworten) ist, ob ein regulärer Timer in dieser Situation genau das gleiche Verhalten hätte oder ob es einen signifikanten Unterschied gibt, über den ich Bescheid wissen sollte.

Danke!

    
JoeCool 24.02.2011, 22:10
quelle

3 Antworten

7

Die Threading.Dispatcher-Klasse enthält eine Liste aller aktiven DispatcherTimers. Wenn Sie im Tick-Ereignishandler Stop () aufrufen, wird der Timer aus dieser Liste entfernt. Es gibt jetzt keine Hinweise mehr auf den Timer. Es wird schließlich Müll gesammelt werden. Das ist in Ordnung, weil es keine Möglichkeit gibt, den Timer erneut zu starten. Schließlich haben Sie keine Möglichkeit mehr, die Referenz zu erhalten, der Tick Event-Handler war Ihre letzte Chance darauf.

    
Hans Passant 24.02.2011, 22:31
quelle
0

Nach diesem müssen Sie anhalten und den Handler entfernen.

    
nullforce 24.02.2011 22:19
quelle
0

Grundsätzlich erzeugt ein DispatcherTimer einen neuen Thread. Sein Bereich kann also nicht so definiert werden, wie wir normalerweise denken würden. Sie können den Thread auch mit bestimmten Methoden beenden.

    
Mani 23.03.2013 14:13
quelle