我有一个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摧毁了他?
答案 0 :(得分:6)
现在当用户关闭此应用程序时,我是否应该删除'EventHandler'?
不,没有必要。除了其他任何事情,如果整个申请都停止了,那意味着这个过程无论如何都会死亡,所以这是无关紧要的。
但即使不是的情况下,计时器也可以与表单同时进行垃圾收集 - 所以这个不是 a事件处理程序将使对象保持活动的时间超过其需要的情况。 (假设你的timer
变量当然是一个实例变量。)
编辑:以上只是解决垃圾收集方面的问题。进一步考虑它,可能可能可能(我不确定实现细节)这里存在竞争条件:如果计时器在表单关闭并隐式处理之后但在事件循环停止运行,你可能最终得到一个计时器滴答,试图在处置的表格上移动球,这将失败。
解决这个问题的最好方法不是删除tick处理程序(IMO) - 它是在处理表单时处置计时器(即在Dispose
方法中 - 可能通过将其添加到容器中组件,但我不确定在那方面。)
这不是事情是否会被垃圾收集 - 事件处理程序是否会在不再合适时被调用(因为表单已被处理)。如果关闭的表单立即关闭事件循环,那很好 - 但我肯定不知道。