Frage

Während des Betrachtens der Timer-Dokumentation Ich bin mit diesem Kommentar über das folgende Beispiel gelaufen: generasacodicetagpre.

bedeutet dies, dass der GC in C # den Müll lokale Variablen sammelt, selbst wenn es Nebenwirkungen hätte?Vermutlich, weil ich nicht auf den Timer darauf zugreife, kann der GC es früher sammeln?

Nicht sicher bin ich ein Fan einer solchen Optimierung, wenn ich das richtig verstehe (aber dann ist ich wahrscheinlich nicht;))

War es hilfreich?

Lösung

Ja, Gc kann vor dem Ende des Umfangs lokale Variable sammeln, sobald nach der letzten Verwendung der Variablen.Wenn Sie gc.Heakalive am Ende des Verfahrens einsetzen, stellt sicher, dass die Variable bis zum Keepalive-Anruf "lebendig" wird.

c # ist eine zwingende Sprache, so dass das GC nicht dazu entworfen wurde, etwas über Nebenwirkungen zu erfahren.

Andere Tipps

Soweit ich den GC verstehe, markiert er jede Variable oder jedes Objekt, von dem er glaubt, dass es im nächsten GC-Zyklus nicht mehr als Kandidat für die Garbage Collection benötigt wird.Ich bin nicht sicher, ob ich die jeweilige Anwendung hier verstehe, aber ich weiß, dass es Fälle gibt, in denen der GC eine Ressource zum Sammeln markiert, wenn sie noch benötigt wird (dies wird jedoch aufgrund der Art und Weise, wie der Code geschrieben wird, nicht angezeigt)/ p>

Normalerweise bleibt während Methoden ein Objekt oder eine Variable für die Dauer des Methodenaufrufs im Gültigkeitsbereich. Wenn der Methodenaufruf jedoch länger als die Zeit zwischen den GC-Zyklen dauert, sieht der GC Ihr Timer-Objekt möglicherweise als außerhalb des Gültigkeitsbereichs und der Markierunges zur Abholung.Durch Hinzufügen der GC.KeepAlive-Methode muss der GC warten, bis die Methode beendet wird, bevor er auf das Timer-Objekt einwirkt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top