从TimerCallback引用Threading.Timer是否可以保护它免受GC攻击

时间:2014-12-11 21:07:38

标签: c# timer garbage-collection closures

想象一下有一种方法:

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 的唯一内容是回调。并且唯一引用回调的是计时器。 该循环是否会引用垃圾收集中的安全计时器

1 个答案:

答案 0 :(得分:0)

来自TFM

  

只要您使用Timer,就必须保留对它的引用。与任何托管对象一样,当没有对它的引用时,Timer会进行垃圾回收。定时器仍处于活动状态这一事实并不能阻止它被收集。

请注意,这是System.Threading.Timer特有的。其他一些Timer类结束了框架中的隐式引用,因此不要求您明确地保留引用以防止收集。

与往常一样,阅读您正在使用的任何API的文档都是值得的。