小编Pet*_*sky的帖子

C#定时器和垃圾收集

根据MSDN,应该保留对System.Threading.Timer的引用,否则它将被垃圾收集.因此,如果我运行此代码,它不会写任何消息(这是预期的行为):

static void Main(string[] args)
{
    RunTimer();
    GC.Collect();
    Console.ReadKey();
}

public static void RunTimer()
{
    new Timer(s => Console.WriteLine("Hello"), null, TimeSpan.FromSeconds(1), TimeSpan.Zero);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我通过将计时器存储在临时局部变量中来稍微修改代码,它会幸存并写入消息:

public static void RunTimer()
{
    var timer = new Timer(s => Console.WriteLine("Hello"));
    timer.Change(TimeSpan.FromSeconds(1), TimeSpan.Zero);
}
Run Code Online (Sandbox Code Playgroud)

在垃圾收集期间,显然无法从根或静态对象访问计时器.所以你能解释为什么计时器存活下来吗?保留的参考在哪里?

.net c# garbage-collection timer

9
推荐指数
1
解决办法
529
查看次数

标签 统计

.net ×1

c# ×1

garbage-collection ×1

timer ×1