以下代码是一个众所周知的示例,用于显示调试和发布版本之间的区别:
using System;
using System.Threading;
public static class Program
{
public static void Main()
{
Timer t = new Timer(TimerCallback, null, 0, 2000);
Console.ReadLine();
}
private static void TimerCallback(Object o)
{
Console.WriteLine("In TimerCallback: " + DateTime.Now);
GC.Collect();
}
}
如果您使用调试配置运行它,计时器将每两秒输出一次当前时间。GC.Collect
没有任何影响,因为编译器人为地延长了变量Timer t
的寿命。在发布配置中,计时器将只执行一次。将GC.Collect
垃圾收集t
变量,就是这样。
这一切都像它应该的那样工作。奇怪的是,当您将 Console.ReadLine 更改为 Console.ReadKey 时,两种配置都会每两秒运行一次计时器。
Console.ReadKey 和 Console.ReadLine 有什么区别?我从文档中了解到 Console.ReadKey 阻止了发出 ReadKey 方法的线程。但是 GC.Collect 仍然会触发..
为什么Timer t
通过阻塞主线程来延长生命周期?
更新
使用 .NET 3.5 时,不会发生此行为!