Pregunta

Tengo el siguiente código:

 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");

    }

Pensé que mi método Finalizer se llamaría a mi llamada a GC.Collect, que no es el caso.

¿Puede alguien explicarme por qué?

¿Fue útil?

Solución

No se llama a los finalizadores antes de que GC.Collect () devuelva. Los finalizadores se ejecutan en un subproceso separado; puede esperarlos llamando a GC.WaitForPendingFinalizers () .

Otros consejos

El finalizador no se llama durante la colección en su ejemplo, ya que todavía está enraizado por la cola finalizable. Sin embargo, está programado para su finalización, lo que significa que se recogerá durante la próxima recolección de basura.

Si desea asegurarse de que se recopilan instancias de tipos con un finalizador, debe hacer dos colecciones como esta.

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

Pero, en general, no debe llamar al método Collect () usted mismo.

Incluso si solicita que se recolecte el GC, no está seguro de que este objeto específico sea destruido (ya que no podría estar en la generación que se está recolectando en ese momento)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top