如何停止和启动计时器?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何停止和启动计时器?相关的知识,希望对你有一定的参考价值。

我的WFP中有一个计时器,我想用一个复选框启动和停止。

目前如果我使用这个:

    private void checkconnect_CheckedChanged(object sender, EventArgs e)
    {


        if (checkconnect.Checked.Equals(true))
        {
            Timer rsTimer = new Timer();
            var timeToWait = 1000;
            rsTimer.Interval = timeToWait;
            rsTimer.Start();
        }
        if (checkconnect.Checked.Equals(false))
        {
            rsTimer.Stop();
            rsTimer.Dispose();
        }

        if (rsTimer.Enabled == true)
        {
            Shorestatuslbl.Text = "Checking";
            buoystatuslbl.Text = "Checking";
            nistatuslbl.Text = "Checking";

            rsTimer.Elapsed += OnTimedEvent;
            void OnTimedEvent(object source, ElapsedEventArgs elapsed)
            {
                try
                {
                    UpdateList("test");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    throw;
                }
            }
        }
        if (rsTimer.Enabled == false)
        {
            Shorestatuslbl.Text = "Idle";
            buoystatuslbl.Text = "Idle";
            nistatuslbl.Text = "Idle";
        }
    }

当我重新检查它给出的复选框和异常时说它无法访问已处置的对象。

如果我删除:

      rsTimer.Dispose();

然后,当我重新启动计时器时,它会每秒向我的列表框打印两个测试。

如何正确启动和停止计时器,以便当我取消选中复选框并再次重新检查时,它不会运行两次?

答案

看起来你已经创建了2个rsTimer对象。一个在Designer模式下,另一个在代码中创建一个新模式。只使用设计师中的那个,这样可以避免混淆。在“计时器”组件的“属性”中设置可以管理的时间间隔和事件。

你可以做得更清洁一点:

    public ImAConstructor()
    {
        rsTimer.Elapsed += OnTimedEvent;
    }

    public void OnTimedEvent(object source, ElapsedEventArgs elapsed)
    {
        try
        {
            UpdateList("test");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            throw;
        }
    }

    private void checkconnect_CheckedChanged(object sender, EventArgs e)
    {
        if (checkconnect.Checked)
            rsTimer.Start();
        else
            rsTimer.Stop();

        if (rsTimer.Enabled)
        {
            Shorestatuslbl.Text = "Checking";
            buoystatuslbl.Text = "Checking";
            nistatuslbl.Text = "Checking";
        }
        else
        {
            Shorestatuslbl.Text = "Idle";
            buoystatuslbl.Text = "Idle";
            nistatuslbl.Text = "Idle";
        }
    }
另一答案

你的checkconnect_CheckedChanged方法中有局部变量Timer rsTimer = new Timer();。当方法范围结束时,rsTimer变量立即被处理。

将rsTimer移动到类级别,然后可以在不同的事件处理程序轮次中访问它。此外,您必须确保事件绑定rsTimer.Elapsed += OnTimedEvent;仅在您的应用程序中完成一次。一旦事件被挂钩,则不再需要绑定。

以上是关于如何停止和启动计时器?的主要内容,如果未能解决你的问题,请参考以下文章

如何停止和启动计时器?

如何在 ReactJS 中启动和停止计时器显示

在javascript中使用OOP启动和停止计时器[重复]

连续暂停/停止和启动/恢复Java TimerTask?

如何停止无尽的 EJB 3 计时器?

如果用户没有使用浏览器,则jQuery计时器停止