Domanda

Guardando il Documentazione timer Ho corso attraverso il seguente esempio con questo commento:

    // Normally, the timer is declared at the class level,
    // so that it stays in scope as long as it is needed.
    // If the timer is declared in a long-running method,  
    // KeepAlive must be used to prevent the JIT compiler 
    // from allowing aggressive garbage collection to occur 
    // before the method ends. You can experiment with this
    // by commenting out the class-level declaration and 
    // uncommenting the declaration below; then uncomment
    // the GC.KeepAlive(aTimer) at the end of the method.
    //System.Timers.Timer aTimer;
    code in between
    // If the timer is declared in a long-running method, use
    // KeepAlive to prevent garbage collection from occurring
    // before the method ends.
    //GC.KeepAlive(aTimer);
.

Questo significa che il GC in C # è permesso di spazzare la spazzatura raccogliere variabili locali anche se avrebbe effetti collaterali?Presumibilmente perché non sto accedendo il timer in seguito, il GC può raccoglierlo prima?

Non sono sicuro di essere un fan di un tale ottimizzazione se lo capisco correttamente (ma probabilmente non lo faccio;))

È stato utile?

Soluzione

Sì, GC potrebbe raccogliere la variabile locale prima della fine dell'ambito, non appena dopo l'ultimo uso della variabile.Mettere GC.Keepadive alla fine del metodo assicura che la variabile sia "vivente" fino alla chiamata keepalive.

c # è un linguaggio imperativo in modo che il GC non sia stato progettato per sapere nulla degli effetti collaterali.

Altri suggerimenti

Per quanto ho capito il GC, segnerà qualsiasi variabile o oggetto che ritiene non sia più necessario come candidato per la raccolta dei rifiuti durante il prossimo ciclo GC.Non sono sicuro che capisco la particolare applicazione qui, ma so che ci sono casi in cui il GC potrebbe contrassegnare una risorsa per la raccolta quando è ancora necessaria (ma non appare così a causa del modo in cui il codice è scritto). .

Normalmente, durante i metodi, un oggetto o una variabile rimane nello scopo della durata della chiamata del metodo, ma se la chiamata del metodo dura più a lungo del tempo tra i cicli GC, il GC potrebbe vedere il tuo oggetto timer come per scope e segnoper la raccolta.L'aggiunta del metodo GC.KeePalive costringe il GC ad attendere fino a quando il metodo usciva prima di agire sull'oggetto del timer.

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