0

我很想知道 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?
        });
}

当我的代码触发更新时,此代码块将每两秒运行一次,然后在我的表单的下角添加一个星号,表示连接有效且良好。我创建了一个没有引用的计时器,它会在一秒钟后再次移除星星,自行停止并自行处理。

4

1 回答 1

0

不, t.Dispose(), 不是必需的,无论如何都会被收集。

这个问题本身似乎传达了对 GC 和工作方式的深刻误解Dispose(我强调这个词)。GC 完全不知道做什么,也不在乎。一个对象是否被处理并不会影响该特定对象是否适合收集;这是两个完全正交的概念。Dispose

Dispose 是一种释放非托管资源的机制,它与垃圾收集器的工作方式无关。

如果这很清楚,那么Dispose尽管有礼貌,但甚至不是绝对必要的;Dispose(或它所需的部分)将在最终收集计时器时运行(对象无法访问且寿命短,因此不应花费太长时间),放入终结器队列并在某个未确定的未来完成;有礼貌并且建议 dispose 以便确定性地释放与对象关联的所有非托管资源,而不是依赖于终结器队列决定运行时,这带来了下一点:

你为什么Timer每两秒钟更新一次然后立即处理它?拥有一个计时器并每次都重置它不是更容易吗?

于 2020-02-28T11:41:16.907 回答