Когда вы используете Timer
или Thread
, которые будут запускаться только на протяжении всего срока службы программы, вам нужно сохранить ссылку на них, чтобы предотвратить их сбор мусора?
Пожалуйста, оставьте в стороне тот факт, что нижеприведенная программа может иметь 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, но мне все же хотелось бы получить ответ о таймерах.