System.Timers.Timer Elapsed.
...
Foo 实例是被销毁了(析构函数已运行,打印出了 End),但定时器还在执行,这是为什么呢?
这是因为,.NET Framework 会确保 System.Timers.Timer 的存活,即便其所属实例已经被销毁回收。
如果改成 System.Threading.Timer,又会如何?
class Program
{
static void Main(string[] args)
{
Start();
GC.Collect();
Read();
}
static void Start()
{
Foo2 f2 = new Foo2();
System.Threading.Thread.Sleep(5_000);
}
}
public class Foo2
{
System.Threading.Timer _timer;
public Foo2()
{
_timer = new System.Threading.Timer(timerTick, null, 0, 1000);
}
static void timerTick(object state)
{
WriteLine("System.Threading.Timer Elapsed.");
}
~Foo2()
{
WriteLine("---------- End ----------");
}
}
注意,这里的 timerTick 方法是静态的。运行结果如下:
System.Threading.Timer Elapsed.
System.Threading.Timer Elapsed.
System.Threading.Timer Elapsed.
System.Threading.Timer Elapsed.
System.Threading.Timer Elapsed.
---------- End ----------
可见,随着 Foo2 实例销毁,_timer 也自动停止并销毁了。
这是因为,.NET Framework 不会保存激活 System.Threading.Timer 的引用,而是直接引用回调委托。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。










