【问题标题】:Cleaning Up Timers?清理计时器?
【发布时间】:2011-03-25 18:25:10
【问题描述】:

以下代码将表单隐藏 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;
        }
    }

非常感谢!

【问题讨论】:

    标签: c# winforms timer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您的假设是正确的 - 测试会为您断言。

      你可以:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-29
          • 1970-01-01
          • 1970-01-01
          • 2020-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-18
          相关资源
          最近更新 更多