代码之家  ›  专栏  ›  技术社区  ›  Thomas Levesque

计时器、事件和垃圾收集:我错过了什么吗?

  •  14
  • Thomas Levesque  · 技术社区  · 14 年前

    请考虑以下代码:

    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按钮时,计时器继续运行,所以我猜它没有被收集…

    有人对此有解释吗?

    附言:这当然不是一个真正的节目,我只是想向某人证明一点…但我的证据不起作用;)

    1 回复  |  直到 14 年前
        1
  •  20
  •   Thomas Levesque    14 年前

    好吧,我想我知道发生了什么…我看了一下 Timer 用Reflector初始化,我在 Enabled 财产:

    this.timerRoot = GCHandle.Alloc(this);
    

    所以,当它启动时,计时器会分配一个 GCHandle 就其本身而言,这会阻止GC收集它…