当您使用将在程序的整个生命周期中运行的 aTimer
或 aThread
时,您是否需要保留对它们的引用以防止它们被垃圾收集?
请抛开以下程序timer
在类中可以作为静态变量的事实,这只是一个展示问题的玩具示例。
public class Program
{
static void Main(string[] args)
{
CreateTimer();
Console.ReadLine();
}
private static void CreateTimer()
{
var program = new Program();
var timer = new Timer();
timer.Elapsed += program.TimerElapsed;
timer.Interval = 30000;
timer.AutoReset = false;
timer.Enabled = true;
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
var timerCast = (Timer)sender;
Console.WriteLine("Timer fired at in thread {0}", GetCurrentThreadId());
timerCast.Enabled = true;
}
~Program()
{
Console.WriteLine("Program Finalized");
}
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
}
可以在上面的示例中收集计时器吗?我运行了一段时间,我从来没有收到异常,也没有消息说~Program()
被调用。
更新:我从这个问题中发现(感谢sethcran)线程被CLR跟踪,但我仍然想要一个关于定时器的答案。