我的timer不执行了,好象被回收了

代码时需要一个timer,这个Timer不需要被引用,所以就定义成了局部变量(或者直接不赋值给任何变量)。但总觉得不妥,因为直觉上认为会被回收,不能一直存在。由于有点懒,也没有马上去实验。后来实在忍受不了这种不踏实的感觉,就做了实验。实验结果表明:Timer的确像其它对象一样,还是会被回收的

PS:
不同的是,回调方法会通过GCHandle的方式阻止GC回收。如果使用的是Timer的一个参数的构造函数(本质是回调函数的State参数为this,即回调函数引用了timer),那么timer则会被回调函数引用,从来不会被回收。

var timer=new Timer(_=>Console.WriteLine("Alive"));
timer.Change(0,1000);

而不是

new Timer(_=>Console.WriteLine("Alive"),null,0,1000);

另外,不要在Debug模式下,因为Visual Studio为了让debug更方便在Debug模式下编译时延长了局部变量的生命周期。

参考 Overflow

发表评论

电子邮件地址不会被公开。