Question

J'ai le code suivant:

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

    }

Je pensais que ma méthode de Finalizer serait appelée lors de mon appel à GC.Collect, ce qui n'est pas le cas.

Quelqu'un peut-il m'expliquer pourquoi?

Était-ce utile?

La solution

Les finaliseurs ne sont pas appelés avant le retour de GC.Collect () . Les finaliseurs sont exécutés dans un thread distinct. Vous pouvez les attendre en appelant GC.WaitForPendingFinalizers () .

Autres conseils

Le finaliseur n'est pas appelé lors de la collecte dans votre exemple, car il est toujours en cours d'enregistrement par la file d'attente pouvant être finalisée. Il doit toutefois être finalisé, ce qui signifie qu'il sera collecté lors du prochain ramassage des ordures.

Si vous voulez vous assurer que des instances de types avec un finaliseur sont collectées, vous devez effectuer deux collectes de ce type.

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

Mais généralement, vous ne devriez pas appeler vous-même la méthode Collect () .

Même si vous demandez au GC de collecter, il est incertain que cet objet spécifique sera détruit (car il ne pourrait pas l'être dans la génération collectée à ce moment-là)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top