C# 清理计时器?

C# 清理计时器?,c#,winforms,timer,C#,Winforms,Timer,下面的代码将表单隐藏10秒钟。没什么太疯狂的。 每次按下按钮时,它都会创建一个新的计时器对象,该对象不会停止,而是继续运行。我的直觉告诉我,如果你多次按下这个按钮,就会有一堆计时器在运行,而只有一个计时器是必需的(或者我的假设是错误的?)。另外,如果我确实需要停止并处理这个计时器,我会将它作为RevelForm中的一个参数发送,还是让计时器成为一个类级变量并每次停止/重置它 private void ButtonHide_Click(object sender, EventArgs e)

下面的代码将表单隐藏10秒钟。没什么太疯狂的。 每次按下按钮时,它都会创建一个新的计时器对象,该对象不会停止,而是继续运行。我的直觉告诉我,如果你多次按下这个按钮,就会有一堆计时器在运行,而只有一个计时器是必需的(或者我的假设是错误的?)。另外,如果我确实需要停止并处理这个计时器,我会将它作为RevelForm中的一个参数发送,还是让计时器成为一个类级变量并每次停止/重置它

    private void ButtonHide_Click(object sender, EventArgs e) {
        this.Visible = false;
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new ElapsedEventHandler(RevealForm);
        t.Interval = 10000;
        t.AutoReset = false;
        t.Start();
    }

    private void RevealForm(object source, ElapsedEventArgs e) {
        InvokeReveal();
    }

    private void InvokeReveal() {
        if (InvokeRequired) {
            Invoke(new Action(InvokeReveal));
        }
        else {
            this.Visible = true;
        }
    }

多谢

您的假设是正确的-测试会为您断言这一点

你可以:

  • A) 在每次执行后(每个间隔)禁用计时器并在单击时启用,或者

  • B) 停止并销毁计时器,并在每次单击时创建一个新的计时器

这两种选择都需要对现有代码进行一些重构


至于问题的第二部分——如何停止计时器是优先考虑的。在这样一个小的应用程序中(如果这是它的全部功能),那么简单地在事件处理程序(或相关方法)中停止计时器就可以了,尽管为了访问
计时器
实例,您可以在范围的更高级别上声明它(即不绑定在click事件处理程序的范围内)

您的假设是正确的-测试会为您断言这一点

你可以:

  • A) 在每次执行后(每个间隔)禁用计时器并在单击时启用,或者

  • B) 停止并销毁计时器,并在每次单击时创建一个新的计时器

这两种选择都需要对现有代码进行一些重构


至于问题的第二部分——如何停止计时器是优先考虑的。在这样一个小的应用程序中(如果这是它的全部功能),那么简单地在事件处理程序(或相关方法)中停止计时器就可以了,尽管为了访问
计时器
实例,您可以在范围的更高级别上声明它(即不绑定在click事件处理程序的范围内)

在类中创建计时器,然后在每次单击时调用t.start()


无需销毁/清理等。只需回收您拥有的计时器。

在类中创建计时器,然后在每次单击时调用t.start()


无需销毁/清理等。只需回收您拥有的一个。

通常,您要做的第一件事是停止事件处理程序中的计时器


如果只需要一个计时器,然后将其设置为表单级变量,请在ButtonHide_单击中启动它,然后在RevealForm方法的顶部停止计时器。

通常,首先要在事件处理程序中停止计时器

如果您只需要一个计时器,那么将其设置为表单级变量,在您的ButtonHide_单击中启动它,然后在RevealForm方法的顶部停止计时器