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

Eli*_*ior 1 .net c# timer winforms

我有一个WindowsForm应用程序 - "Bouncing Balls",所以我有一个表单的计时器,因为在每个刻度我移动球.

在我的形式c'tor我有这个代码:

public Form1(){

  timer = new Timer();
  timerHandler = new EventHandler(timerTick);
  timer.Tick += timerHandler;
  timer.Enabled = true;
}
Run Code Online (Sandbox Code Playgroud)

现在当用户关闭此应用程序时,我是否应该删除'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();
        }
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

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

不,没有必要.除了其他任何事情,如果整个应用程序停止,这意味着该过程将无论如何都会死亡,因此它是无关紧要的.

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

编辑:以上只是解决垃圾收集方面的问题.关于它的进一步思考,这是潜在的可能(我不知道的实施细则),有一个竞争条件在这里:如果计时器滴答声的形式已经被关闭后,隐式布置,但事件循环停止运行之前,你可以最终得到一个计时器滴答,试图将球移动到处置的形式,这将失败.

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

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