Die GC lokale Variablen für die Sammlung markiert, wenn sie nicht mehr verwendet werden. Du musst dir deswegen keine Sorgen machen.
Wenn die Sammlung beginnt, es wird davon ausgegangen, dass zuerst alle Objekte in der Halde nicht erreichbar sind (garbage); Dazu gehört das Timer-Objekt. Dann, der Kollektor untersucht die Wurzeln der Anwendung und sieht, dass Main nicht die t-Variable nach der ursprünglichen Zuordnung zu ihm verwendet. Daher hat die Anwendung keine Variable, die sich auf das Objekt Timer bezieht, und die Speicherbereinigung ruft den Speicher dafür zurück; Diese stoppt den Timer und erklärt, warum die TimerCallback-Methode nur einmal aufgerufen wird.
Nehmen wir an, Sie verwenden einen Debugger, um durch Main zu gehen, und eine Garbage Collection passiert gerade, kurz nachdem t die Adresse des neuen Timer-Objekts zugewiesen wurde. Angenommen, Sie versuchen, das Objekt anzuzeigen, auf das sich t bezieht, indem Sie das Quick Watch des Debuggers verwenden. Was denkst du wird passieren? Der Debugger kann Ihnen das Objekt nicht anzeigen, da es nur Müll gesammelt wurde. Dieses Verhalten würde von den meisten Entwicklern als sehr unerwartet und unerwünscht angesehen werden, so dass Microsoft eine Lösung gefunden hat.
Wenn Sie Ihre Assembly mit dem C# Compiler/Debug-Schalter, der Compiler wendet eine System.Diagnostics.DebuggableAttribute mit seinen DebuggingModes’ DisableOptimizations Flag gesetzt in die resultierende Baugruppe zusammenstellen. Zur Laufzeit beim Kompilieren einer Methode sieht der JIT-Compiler dieses Flag gesetzt und verlängert künstlich die Lebensdauer aller Wurzeln auf das Ende der Methode. Für mein Beispiel trickst der JIT-Compiler sich selbst zu glauben, dass die t-Variable in Main bis Ende der Methode leben muss. Also, wenn eine Garbage Collection stattfinden sollte, denkt der Müll Collector jetzt, dass t immer noch ein Root ist und dass das Timer Objekt , auf das sich t bezieht, weiterhin erreichbar sein wird.Das Timer-Objekt überlebt die Sammlung und die TimerCallback-Methode wird wiederholt aufgerufen, bis Console.ReadLine zurückkehrt und Main beendet wird.
Um .. auf Null gesetzt? Es ist ziemlich schwer zu tun, da Strings unveränderlich sind. Was sind deine Bedenken? – Botonomous
Warum verwenden Sie überhaupt die Bibliothek "Regex" – Jonesopolis
1) Regex in diesem Problem ist Overkill, 2) Sie brauchen sich nicht darum kümmern, wird GC alle Arbeit erledigen. –