Warum ist nicht mein .net destructor in diesem sehr einfachen Szenario genannt?
-
03-07-2019 - |
Frage
Ich habe den folgenden Code bekommen:
public class A
{
~A()
{
Console.WriteLine("destructor");
}
}
public static A Aref;
static void Main(string[] args)
{
Aref = new A();
int gen = GC.GetGeneration(Aref);
Aref = null;
GC.Collect(gen, GCCollectionMode.Forced);
Console.WriteLine("GC done");
}
dachte ich, meine Finalizer-Methode auf meinen Aufruf an GC.Collect genannt werden würde, was nicht der Fall ist.
Kann mir jemand erklären, warum?
Lösung
Finalizer nicht vor GC.Collect()
kehrt genannt. Die Finalizers werden in einem separaten Thread ausgeführt -. Sie für sie durch den Aufruf GC.WaitForPendingFinalizers()
warten
Andere Tipps
Die Finalizerthread nicht während der Sammlung in Ihrem Beispiel genannt, weil es nach wie vor durch die finalizable Warteschlange verwurzelt wird. Es ist jedoch für Fertigstellung geplant, was bedeutet, dass es bei der nächsten Garbage Collection gesammelt werden.
Wenn Sie sicher, dass Instanzen von Typen mit Finalizerthread machen wollen Sie gesammelt brauchen wie diese beiden Sammlungen zu tun.
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Aber in der Regel sollten Sie nicht die Collect()
Methode selbst nennen.
Auch wenn Sie für die GC fragen zu sammeln, ist es nicht sicher, dass dieses spezifische Objekt zerstört wird (da es nicht in der Erzeugung in diesem Moment gesammelt werden könnte)