何时删除c#中的Timer事件处理程序?

时间:2013-01-12 12:49:21

标签: c# .net winforms timer

我有一个WindowsForm应用程序 - “Bouncing Balls”,所以我有一个表单的计时器 因为在每个滴答声中我移动球。

在我的表格中,我有这段代码:

public Form1(){

  timer = new Timer();
  timerHandler = new EventHandler(timerTick);
  timer.Tick += timerHandler;
  timer.Enabled = true;
}

现在当用户关闭此应用程序时,我是否应该删除'EventHandler'? 我有一个退出按钮,所以当用户点击它时,我会向他显示一个弹出对话框询问 他是否真的想退出申请。如果他点击“是”,我正在关闭应用程序,否则没有任何反应。

所以在我的Exit Button代码中我编写了这段代码:

DialogResult result= MessageBox.Show("Do you really want to quit?", "Exit",  
                                     MessageBoxButtons.YesNo);
        if (result == DialogResult.Yes)
        {
             timer.Tick -= timerHandler;
             this.close();
        }

当应用程序关闭时,我是否应该担心timerHandler或GC摧毁了他?

1 个答案:

答案 0 :(得分:6)

  

现在当用户关闭此应用程序时,我是否应该删除'EventHandler'?

不,没有必要。除了其他任何事情,如果整个申请都停止了,那意味着这个过程无论如何都会死亡,所以这是无关紧要的。

但即使不是的情况下,计时器也可以与表单同时进行垃圾收集 - 所以这个不是 a事件处理程序将使对象保持活动的时间超过其需要的情况。 (假设你的timer变量当然是一个实例变量。)

编辑:以上只是解决垃圾收集方面的问题。进一步考虑它,可能可能可能(我不确定实现细节)这里存在竞争条件:如果计时器在表单关闭并隐式处理之后但在事件循环停止运行,你可能最终得到一个计时器滴答,试图在处置的表格上移动球,这将失败。

解决这个问题的最好方法不是删除tick处理程序(IMO) - 它是在处理表单时处置计时器(即在Dispose方法中 - 可能通过将其添加到容器中组件,但我不确定在那方面。)

这不是事情是否会被垃圾收集 - 事件处理程序是否会在不再合适时被调用(因为表单已被处理)。如果关闭的表单立即关闭事件循环,那很好 - 但我肯定不知道。