2010-02-22 5 views
13

Considere el siguiente código:Contador de tiempo, evento y recolección de basura: ¿me falta algo?

class TestTimerGC : Form 
{ 
    public TestTimerGC() 
    { 
     Button btnGC = new Button(); 
     btnGC.Text = "GC"; 
     btnGC.Click += (sender, e) => GC.Collect(); 
     this.Controls.Add(btnGC); 

     System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer(); 
     tmr.Interval = 1000; 
     tmr.Tick += (sender, e) => this.Text = DateTime.Now.ToString(); 
     tmr.Start(); 
    } 
} 

Si no me equivoco, después de la variable tmr sale del ámbito, la Timer no hace referencia a ninguna parte, por lo que debe ser elegible para la recolección de basura. Pero cuando hago clic en el botón GC, el temporizador continúa funcionando, así que supongo que no se recopiló ...

¿Alguien tiene una explicación para eso?

PS: no es un verdadero programa, por supuesto, yo sólo estaba tratando de demostrar un punto a alguien ... pero mi prueba no funcionó;)

+0

Supongo que este es un temporizador de WinForms. – SLaks

+0

sí lo es, actualicé el código para dejarlo claro –

Respuesta

20

bien, creo que sé lo que está pasando en ... miré el código de la clase Timer con reflector, y me encontré con la siguiente instrucción en la incubadora de la propiedad Enabled:

this.timerRoot = GCHandle.Alloc(this); 

por lo tanto, cuando se inicia el temporizador asigna un GCHandle de en sí, lo que impide su recolección por parte del GC ...

Cuestiones relacionadas