3

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

在我的表单中,我有以下代码:

public Form1(){

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

现在当用户关闭此应用程序时,我是否需要删除“EventHandler”?我有一个退出按钮,所以当用户单击它时,我会向他显示一个弹出对话框,询问他是否真的想退出应用程序。如果他点击“是”,我将关闭应用程序,否则什么也不会发生。

所以在我的退出按钮代码中我写了这个代码:

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

当应用程序关闭时,我应该担心 timerHandler 还是 GC 破坏了他?

4

1 回答 1

8

现在当用户关闭此应用程序时,我是否需要删除“EventHandler”?

不,没有必要。除此之外,如果整个应用程序正在停止,这意味着该进程无论如何都会死,所以它是无关紧要的。

但即使不是这种情况,计时器也将有资格与表单同时进行垃圾收集 - 因此事件处理程序不会让对象保持比它需要的时间更长的时间。(当然,这是假设您的timer变量是实例变量。)

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

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

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

于 2013-01-12T12:52:13.580 回答