2010-02-22 14 views
13

Rozważmy następujący kod:Czasomierz, zdarzenie i wyrzucanie śmieci: czy czegoś brakuje?

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

Jeśli się nie mylę, po zmiennej tmr wykracza poza zakres rozporządzenia, Timer nie odwołuje się nigdzie, więc powinien mieć prawo do zbierania śmieci. Ale kiedy klikam przycisk GC, zegar nadal działa, więc domyślam się, że nie został on pobrany ...

Czy ktoś ma wyjaśnienie tego?

PS: to nie jest prawdziwy program, oczywiście, ja po prostu staramy się udowodnić, punkt do kogoś ... ale mój dowód nie działa;)

+0

Zakładam, że jest to zegar WinForm. – SLaks

+0

Tak, jest, zaktualizowałem kod, aby to wyjaśnić –

Odpowiedz

20

OK, myślę, że wiem, co się dzieje na ... Spojrzałem na kod klasy Timer z reflektorem i znalazłem następujące instrukcje w ustawiająca nieruchomości Enabled:

this.timerRoot = GCHandle.Alloc(this); 

Więc, gdy jest uruchomiony, zegar przydziela GCHandle dla sam w sobie, co uniemożliwia jej zbieranie przez GC ...

Powiązane problemy