【发布时间】:2026-02-12 15:25:02
【问题描述】:
我很想知道 System.Timers.Timer 何时被视为垃圾并因此被垃圾收集器收集,如果我不存储对它的引用,但它已启用。
但是在什么时候我的计时器被认为是垃圾?
考虑以下代码:
public void TriggerUpdateStatus() {
toolStripStatusLabel1.Text = "*";
new Timer() {
Interval = 1000,
Enabled = true
}.Elapsed += new ElapsedEventHandler(
(object sender, ElapsedEventArgs args) => {
toolStripStatusLabel1.Text = "";
Timer t = ((System.Timers.Timer) sender);
t.Stop();
t.Dispose();//Is this needed?
});
}
当我的代码触发更新时,此代码块将每两秒运行一次,然后在我的表单的底角添加一个星号,表示连接有效且良好。我创建了一个没有引用的计时器,它会在一秒钟后再次移除星星,自行停止并自行处理。
【问题讨论】:
-
它在运行时如何/为什么会被视为垃圾???
-
在第 10 行,它会自行停止,并在第 11 行自行处理。
-
您问:如果我不存储对它的引用,但它已启用。现在是哪个?
-
您的
Timer对象甚至在方法返回之前(根据您的代码)就有资格进行垃圾回收。但是,您无法确切知道何时收集此对象。 .NET 中的 GC 以这种方式是不确定的。请注意,Timer是一个Component,它有一个终结器,如果它将在收集时运行(更准确地说,处理终结器队列的时间),它将自动禁用正在运行的计时器。
标签: c# garbage-collection system.timers.timer