using System;
using System.Threading;
public static class Program{
public static void Main(){
//创建一个Timer对象,每隔2000毫秒就调用一次TimerCallBack方法
Timer t= new Timer(TimerCallBack, null, 0, 2000);
Console.ReadLine();
}
private static void TimerCallBack(Object o){
Console.WriteLine("In TimerCallBack:" + DateTime.Now);
//出于演示目的,强制执行一次垃圾回收
GC.Collect();
}
}
垃圾回收开始时,垃圾回收器首先假定堆中的所有对象都是不可达的(垃圾);这当然也包括Timer对象。然后,垃圾回收器检查应用程序的根,发现在初始化以后,Main方法再也没有用过变量t . 既然应用程序没有任何变量应用Timer对象,垃圾回收就回收了分配给它的内存;这使计时器停止触发,并解释了为什么TimerCallback方法只被调用了一次。
注意:如果当前在调试程序,会造成整个出人意料无法显示对象t的情况。因此Microsoft提出一个解决方案:JIT编译器将方法的IL代码编译成本地代码时,JIT编译器会检查两点:定义方法的程序集在编译时没有优化;进程当前在一个调试器中执行。如果这两点都成立,JIT编译器在生产方法的内存根表时,会将所有变量的生存期手动延长至方法结束。换言之,JIT编译器自己骗自己,让自己认为Main中的t变量必须生存到方法结束。