如何停止和启动计时器?

时间:2018-01-31 13:21:47

标签: c# timer

我的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 个答案:

答案 0 :(得分:3)

您的 checkconnect_CheckedChanged -method中包含本地变量Timer rsTimer = new Timer();。当方法范围结束时,rsTimer变量立即被处理。

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

答案 1 :(得分:2)

您似乎已经创建了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";
        }
    }