2010-02-22 8 views
13

Betrachten Sie den folgenden Code ein:Timer, Event und Garbage Collection: Fehle ich etwas?

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

Wenn mich nicht alles täuscht, nachdem die tmr Variable den Gültigkeitsbereich verlässt, wird die Timer nicht überall referenziert, so dass es für die Garbage Collection in Betracht kommen sollten. Aber wenn ich auf den GC-Knopf klicke, läuft der Timer weiter, also denke ich, dass er nicht gesammelt wurde ...

Hat jemand eine Erklärung dafür?

PS: es ist kein richtiges Programm natürlich, ich war nur noch einen Punkt zu jemandem versuchen zu beweisen, ... aber mein Beweis funktioniert nicht;)

+0

Ich nehme an, dass dies ein WinForms-Timer ist. – SLaks

+0

ja ist es, ich habe den Code aktualisiert, um das klar zu machen –

Antwort

20

OK, ich glaube, ich weiß, was los ist weiter ... ich auf dem Code der Timer Klasse mit Reflektor sah, und ich fand die folgende Anweisung in dem Setter der Enabled Eigenschaft:

this.timerRoot = GCHandle.Alloc(this); 

Also, wenn es gestartet wird, ordnet der Zeitgeber ein GCHandle für selbst, was seine Sammlung durch den GC verhindert ...