繁体   English   中英

什么时候在C#中删除Timer事件处理程序?

[英]When to remove Timer event handler in c#?

我有一个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销毁他吗?

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

不,没有必要。 除此之外,如果整个应用程序都在停止,则意味着该过程将终止,因此无关紧要。

但是,即使是情况并非如此,计时器将有资格进行垃圾回收,同时为形式反正-所以这不是地方比它需要的是事件处理程序将保持对象存活长的情况。 (当然,这是假设您的timer变量是实例变量。)

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

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

这与是否要垃圾回收无关紧要,这是事件处理程序在不再合适时是否将被调用的原因(因为已经处理了表单)。 如果表单关闭立即关闭了事件循环,那很好-但是我不确定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM