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?

War es hilfreich?

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)

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