为什么Timer在为其分配null之后仍然会触发Elapsed事件

时间:2014-08-30 18:24:08

标签: c# .net wpf

我在App.cs中设置了Timer,如下所示:

public static void SetSnipDeletingTimer(double d)
{
     TimeBeforeDeletingSpan = new Timer(d) {AutoReset = true, Enabled = true};
     TimeBeforeDeletingSpan.Elapsed += TimeBeforeDeletingSpan_Elapsed;
     TimeBeforeDeletingSpan.Start();
}

static void TimeBeforeDeletingSpan_Elapsed(object sender, ElapsedEventArgs e)
{
     foreach (var t in ListOfCapturesUriPaths) File.Delete(t);
}

在另一个类和某个逻辑中,我将null分配给它来阻止它,我只是这样做:

App.TimeBeforeDeletingSpan = null;

问题是每次跨越时Elapsed事件仍会被触发,如此屏幕截图所示,虽然对象为null,但断点在事件内停止:

enter image description here

怎么可能?我应该怎么做才能停止执行该事件?

2 个答案:

答案 0 :(得分:2)

要防止尚未启动的事件:

 App.TimeBeforeDeletingSpan.Enabled = false;

将对象置于休眠状态(无论对象是什么意思),

App.TimeBeforeDeletingSpan.Dispose();

null分配给先前引用该对象的字段对该对象没有任何作用的原因是该对象可以被任何其他字段或变量引用。只有垃圾收集器才能找到并且只有它运行时才会找到。

答案 1 :(得分:0)

设置对象的空引用不会处理给定对象,如果类型实现了IDisposable,则需要手动处理它。

另外要记住的是,Timers在一个单独的线程上运行,将其设置为null将不会阻止该线程继续运行,如前所述,您需要确保它被丢弃。

相关问题