Khi bạn sử dụng Timer
hoặc Thread
sẽ chỉ chạy trong toàn bộ thời gian của chương trình, bạn có cần giữ tham chiếu đến chúng để ngăn chúng không bị thu gom rác không?Bộ hẹn giờ có thể tự động thu gom rác không?
Hãy để dành một thực tế là chương trình bên dưới có thể có timer
làm biến tĩnh trong lớp, đây chỉ là ví dụ về đồ chơi để hiển thị sự cố.
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();
}
Bộ hẹn giờ có được thu thập trong ví dụ trên không? Tôi đã chạy nó một thời gian và tôi không bao giờ có ngoại lệ cũng như một thông báo nói rằng ~Program()
được gọi.
UPDATE: tôi phát hiện ra từ this question (thanks sethcran) mà chủ đề đang theo dõi bởi CLR, nhưng tôi vẫn muốn một câu trả lời về Timers.
Loại 'Hẹn giờ' nào bạn đang sử dụng ở đây? WinForms, Threading, vv ... – JaredPar
@JaredPar Bất kỳ trong số chúng (nhưng tôi đã sử dụng 'System.Timers' trong ví dụ trên). Tôi cũng tò mò nếu tôi cần phải giữ một tham chiếu đến bất kỳ chủ đề tôi tạo bằng cách sử dụng 'Thread' –
http: // stackoverflow.com/questions/9011831/new-thread-and-garbage-collection – Sethcran