清理计时器?

时间:2011-03-25 18:25:10

标签: c# winforms timer

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

    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;
        }
    }

非常感谢!

3 个答案:

答案 0 :(得分:1)

您的假设是正确的 - 测试会为您声明。

你可以:

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

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

任何一个选项都需要对现有代码进行一些重构。

关于问题的第二部分 - 如何停止计时器是优先的。在这么小的应用程序中(如果这是它的整个功能)那么简单地在事件处理程序(或相关方法)中停止计时器就可以做到这一点,但是为了访问Timer实例,你会声明它在范围的更高级别(即不受click事件处理程序范围的限制)。

答案 1 :(得分:1)

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

无需销毁/清理/等。只需回收你的那个。

答案 2 :(得分:1)

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

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