定时器、事件和垃圾收集:我错过了什么?考虑以下代码:classTestTimerGC:Form{publicTestTimerGC(){ButtonbtnGC=newButton();btnGC.Text="GC";btnGC.Click+=(sender,e)=>GC.Collect();这个.Controls.Add(btnGC);System.Windows.Forms.Timertmr=newSystem.Windows.Forms.Timer();tmr.Interval=1000;tmr.Tick+=(sender,e)=>this.Text=DateTime.Now.ToString();tmr.开始();如果我没记错的话,在tmr变量超出范围后,Timer不会在任何地方被引用,因此它应该符合垃圾回收的条件。但是当我按下GC按钮时,计时器一直在运行,所以我猜它没有被收集……有人对此有解释吗?PS:当然,这不是一个真正的程序,我只是想向其他人证明一点......但我的证明不起作用;)好吧,我想我知道发生了什么......我使用Reflector来查看Timer类的代码,发现在Enabled属性的setter中有如下指令:this.timerRoot=GCHandle.Alloc(this);因此,定时器在启动时,为自己分配了一个GCHandle,从而阻止了GC的收集……以上是C#学习教程:定时器、事件和垃圾收集:我错过了什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
