Pregunta

Mientras consulta la documentación del temporizador Me encontré con el siguiente ejemplo con este comentario:

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

¿Significa esto que el GC en C # puede recolectar variables locales de recolección de basura incluso si tuviera efectos secundarios?¿Es de suponer que porque no accedo al temporizador después de nuevo, el GC puede recogerlo antes?

No estoy seguro de ser un fanático de esta optimización si lo entiendo correctamente (pero probablemente no lo entiendo;))

¿Fue útil?

Solución

Sí, GC puede recopilar variable local antes de finalizar el alcance, tan pronto como después del último uso de la variable.Poner GC. En cuanto al final del método garantiza que la variable estará 'viva' hasta la llamada de Keepalive.

C # es un lenguaje imperativo para que el GC no haya sido diseñado para saber nada sobre los efectos secundarios.

Otros consejos

Según tengo entendido, el GC marcará cualquier variable u objeto que crea que ya no es necesario como candidato para la recolección de basura durante el próximo ciclo del GC.No estoy seguro de entender la aplicación en particular aquí, pero sé que hay casos en los que el GC puede marcar un recurso para la recolección cuando todavía es necesario (pero no lo parece debido a la forma en que está escrito el código).

Normalmente, durante los métodos, un objeto o variable permanece dentro del alcance durante la duración de la llamada al método, pero si la llamada al método dura más que el tiempo entre ciclos de GC, el GC podría ver su objeto Timer como fuera del alcance y marcarpara la colección.Agregar el método GC.KeepAlive obliga al GC a esperar hasta que el método salga antes de actuar sobre el objeto Timer.

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