为何删除计时器的处理程序

时间:2014-05-09 13:03:38

标签: .net vb.net

我有一个问题,我在一些项目中看到的东西,我必须接管的项目。在一个表单中,开发人员声明了一个非常简单的15秒计时器。

Private WithEvents mtmrManualDecision As New System.Timers.Timer(15000)

现在,我知道这个计时器将在通过mtmrManualDecision.Start()启动后15秒内触发mtmrManualDecision_Elapsed事件。我也熟悉通过mtmrManualDecision.Stop()停止这个计时器。但是,我在表单的某些部分看到了这行代码(例如,单击按钮或关闭表单时)。

RemoveHandler mtmrEvaluation.Elapsed, AddressOf mtmrEvaluation_Elapsed

我相信这基本上是在停止计时器。为什么这样做而不是停止?在此之后它没有被添加回来或再次使用,所以我想知道为什么需要这样做。除非我在自己的代码中实际使用了AddHandler,否则我通常不会使用RemoveHandler。我相信使用" WithEvents"自动为Elapsed事件添加处理程序,他只想删除它。这是否真的有必要,并且垃圾收集不会像处理其他事件那样去除处理程序等。)

任何澄清或想法将不胜感激。非常感谢你。

2 个答案:

答案 0 :(得分:1)

  

我相信这基本上就是停止计时器

不,它正在移除一个处理程序。如果有任何其他处理程序,那些将继续触发。或者开发人员希望以后能够重新添加处理程序,计时器保持其原始计划(而不是停止/启动将改​​变计划)。

您还没有真正为我们提供足够的信息来进入原始开发人员的头脑,但这些只是为什么从计时器中删除处理程序与停止它的原因相同的示例

答案 1 :(得分:1)

  

我相信这基本上会停止计时器。

不,它不会停止计时器。计时器停止或处理它之前,计时器不会停止。删除处理程序后,计时器将停止将事件传递给您的程序,但它会在后台继续“滴答”。

例如,如果您将处理程序在15秒间隔内移除3秒,然后在2秒后将其添加回来,则会在10秒之后(3 + 2 + 10 = 15)获得一个事件。

删除处理程序的一个原因是让其关联对象(如果有)符合垃圾回收的条件。这可以防止“lingerer”内存泄漏。例如,考虑一个生成对象的计时器,并将其存储到与另一个对象关联的列表中,该对象由主程序拥有。假设您的主程序在某些时候丢弃了托管列表的对象。但是,如果事件处理程序保留对该对象的强引用,则该列表可能无法进行垃圾回收。明确取消注册事件是解决此问题的一种方法;另一种方法是使用Weak Event Pattern