2014-05-09 65 views
0

我有一个问题,关于我在一些项目中的某些VB.NET代码中看到的东西,我不得不接管。在一种形式中,开发者已经宣布了一个非常简单的15秒计时器。为什么要删除定时器的处理程序?

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

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

RemoveHandler mtmrEvaluation.Elapsed, AddressOf mtmrEvaluation_Elapsed 

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

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

回答

1

我认为这基本上是停止计时器

不,它除去1个处理器。如果有任何其他处理程序,那些将继续射击。或者,也许开发人员希望能够在稍后重新添加处理程序,并使计时器保持其原始计划(而不是停止/启动,这将改变计划)。

您并没有真正为我们提供足够的信息以进入原始开发人员的头部,但这些仅仅是为什么从定时器中删除处理程序不是与停止它相同的示例。

1

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

不,它不停止计时器。定时器不会停止,直到程序停止或处理它。一旦你删除处理程序,计时器将停止将事件传送到你的程序,但它会在后台继续“滴答”。例如,如果您在15秒间隔内移除处理程序3秒钟,然后在2秒钟后将其添加回来,您将在10秒钟后(3 + 2 + 10 = 15)再次获得一个事件。

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

相关问题