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

本文关键字:Timer 事件处理 程序 删除 何时 | 更新日期: 2023-09-27 17:51:24

我有一个WindowsForm应用程序- "弹跳球",所以我有一个定时器的形式因为每一秒我都在移动球。

在我的表单c'tor中,我有这样的代码:

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

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

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

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

我应该担心timerHandler或GC在应用程序关闭时销毁它吗?

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

现在当用户关闭这个应用程序时,我是否需要删除' eventandler '?

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

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

编辑:以上只是处理垃圾收集方面的事情。进一步思考,潜在的可能(我不确定实现细节)这里有一个竞争条件:如果计时器在窗体关闭并隐式处理之后滴答,但在事件循环停止运行之前,您可能会以试图移动已处理窗体上的球的计时器滴答结束,这将失败。

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

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