2010-02-22 9 views
13

Si consideri il seguente codice:Timer, raccolta eventi e rifiuti: mi manca qualcosa?

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(); 
    } 
} 

Se non mi sbaglio, dopo la variabile tmr va fuori del campo di applicazione, il Timer non viene fatto riferimento da nessuna parte, quindi dovrebbe essere per la garbage collection. Ma quando clicco sul pulsante GC, il timer continua a funzionare, quindi suppongo che non sia stato raccolto ...

Qualcuno ha una spiegazione per questo?

PS: non è un vero e proprio programma, naturalmente, stavo solo cercando di dimostrare un punto a qualcuno ... ma la mia prova non ha funzionato;)

+0

Suppongo che questo sia un timer WinForms. – SLaks

+0

sì, ho aggiornato il codice per renderlo chiaro –

risposta

20

OK, penso di sapere cosa sta succedendo su ... ho guardato il codice della classe Timer con riflettore, e ho trovato la seguente istruzione nel setter della proprietà Enabled:

this.timerRoot = GCHandle.Alloc(this); 

Così, quando viene avviato, il timer assegna un GCHandle per stesso, che ne impedisce la raccolta da parte del GC ...

Problemi correlati