想象一下有一种方法:
public static void Foo()
{
Timer timer = null;
timer = new Timer(
callback: _ =>
{
if (satisfied)
{
timer.Change(1000, Timeout.Infinite);
return;
}
timer.Dispose();
},
state: null,
dueTime: Timeout.Infinite,
period: Timeout.Infinite);
timer.Change(0, Timeout.Infinite);
}
当方法 Foo()完成时,引用 timer 的唯一内容是回调。并且唯一引用回调的是计时器。 该循环是否会引用垃圾收集中的安全计时器?
答案 0 :(得分:0)
来自TFM:
只要您使用Timer,就必须保留对它的引用。与任何托管对象一样,当没有对它的引用时,Timer会进行垃圾回收。定时器仍处于活动状态这一事实并不能阻止它被收集。
请注意,这是System.Threading.Timer
特有的。其他一些Timer
类结束了框架中的隐式引用,因此不要求您明确地保留引用以防止收集。
与往常一样,阅读您正在使用的任何API的文档都是值得的。