Đây là một minh chứng thú vị. Lưu ý bạn nên chạy bản demo này được biên dịch trong chế độ phát hành hoặc nó có thể không hoạt động như được quảng cáo.
Phiên bản 1:
private void Button_Click(object sender, EventArgs e)
{
Timer timer = new Timer(Print, null, 0, 1000);
}
private void Print(Object o)
{
if (textBox1.InvokeRequired)
{
Action<object> action = Print;
textBox1.Invoke(action, o);
return;
}
textBox1.Text = DateTime.Now.ToString();
}
Phiên bản 1 hạnh phúc sẽ in ngày tháng và thời gian để vào hộp văn bản một lần thứ hai.
Version 2:
private void Button_Click(object sender, EventArgs e)
{
Timer timer = new Timer(Print, null, 0, 1000);
}
private void Print(Object o)
{
if (textBox1.InvokeRequired)
{
Action<object> action = Print;
textBox1.Invoke(action, o);
return;
}
textBox1.Text = DateTime.Now.ToString();
GC.Collect(); // force a garbage collection
}
Bây giờ trong phiên bản 2, ngày và thời gian sẽ chỉ được in một lần bởi vì, sau khi tuyên bố, không có nhiều tài liệu tham khảo cho các đối tượng hẹn giờ, và do đó các đối tượng timer được được thu thập.
Đó là một ví dụ khá giả tạo nhưng có thể làm cho một cuộc biểu tình tốt.
tôi phải ghi Jeffery Richter cho một này - đó là trong cuốn sách tuyệt vời của mình CLR via C#
.
Mất thời gian là nhược điểm duy nhất. – Dialecticus
Bởi "buộc bộ sưu tập" tôi giả sử bạn có nghĩa là bằng cách gọi GC.Collect(). Tại sao bạn nghĩ điều đó sẽ nguy hiểm? Có một số tài liệu mà tôi bị mất mà nói như vậy? (Tôi nhận thấy khả năng là cao, vì tôi không thể theo kịp những ngày này.) – David
Bộ hẹn giờ chặt chẽ với các yêu cầu thời gian thực có thể? – leppie