【问题标题】:Timer, event and garbage collection : am I missing something?计时器、事件和垃圾收集:我错过了什么吗?
【发布时间】:2010-02-22 13:13:42
【问题描述】:

考虑以下代码:

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

如果我没记错的话,tmr 变量超出范围后,Timer 不会在任何地方引用,因此它应该可以进行垃圾回收。但是当我点击GC按钮时,计时器继续运行,所以我猜它没有被收集......

有人对此有解释吗?

PS:这当然不是一个真正的程序,我只是想向某人证明一个观点……但我的证明没有用;)

【问题讨论】:

  • 我假设这是一个 WinForms 计时器。
  • 是的,我更新了代码以明确这一点

标签: c# .net garbage-collection timer


【解决方案1】:

好的,我想我知道是怎么回事了...我用Reflector查看了Timer类的代码,在Enabled属性的setter中找到了以下指令:

this.timerRoot = GCHandle.Alloc(this);

所以,当它启动时,定时器会为自己分配一个GCHandle,这会阻止它被GC收集...

【讨论】:

猜你喜欢
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
相关资源
最近更新 更多