Domanda

Ho il seguente codice:

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

    }

Ho pensato che il mio metodo Finalizer sarebbe stato chiamato alla mia chiamata a GC.Collect, che non è il caso.

Qualcuno può spiegarmi perché?

È stato utile?

Soluzione

I finalizzatori non vengono chiamati prima della restituzione di GC.Collect () . I finalizzatori vengono eseguiti in un thread separato: puoi aspettarli chiamando GC.WaitForPendingFinalizers () .

Altri suggerimenti

Il finalizzatore non viene chiamato durante la raccolta nell'esempio, poiché è ancora rootato dalla coda finalizzabile. Tuttavia è prevista la finalizzazione, il che significa che verrà raccolta durante la prossima raccolta dei rifiuti.

Se vuoi assicurarti che vengano raccolte istanze di tipi con un finalizzatore devi fare due raccolte come questa.

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

Ma generalmente non dovresti chiamare tu stesso il metodo Collect () .

Anche se chiedi la raccolta da parte del GC, non è sicuro che questo specifico oggetto verrà distrutto (in quanto non potrebbe essere nella generazione raccolta in quel momento)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top