为什么我不能停止计时器

时间:2016-08-21 06:05:08

标签: c# timer

我创建一个窗口表单应用程序,按下按钮每5分钟执行一次该方法,然后再次按下以停止执行...但即使我从计时器调用stop方法,它仍然继续执行该方法。

System.Timers.Timer t = new System.Timers.Timer(TimeSpan.FromMinutes(5).TotalMilliseconds);
t.AutoReset = true;
t.Elapsed += new System.Timers.ElapsedEventHandler(my_method);
if (start == false)
{
    t.Start();
    start = true;
    Checkbutton.Text = "End";
}
else
{
    t.Stop();
    t.AutoReset = false;
    Checkbutton.Text = "Begin";
    MessageBox.Show("Auto Check Stop!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

3 个答案:

答案 0 :(得分:2)

每次单击按钮时,您都要实例化一个新的Timer类实例,该按钮已提供给用户以控制计时器的启动/停止状态。 在将其声明为成员变量或在表单类的构造函数内部时,您应该只将其实例化内联。然后在按钮单击事件处理程序中调用其Start / Stop API,如下面的代码所示,根据start标志值更改它的状态:

public partial class Form1 : Form
{
        System.Timers.Timer t = new System.Timers.Timer(TimeSpan.FromMinutes(5).TotalMilliseconds);
        bool start == false;

        public Form1()
        {
            InitializeComponent();
            t.AutoReset = true;
            t.Elapsed += new System.Timers.ElapsedEventHandler(my_method);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (start == false)
            {
                t.Start();
                start = true;
                Checkbutton.Text = "End";
            }
            else
            {
                t.Stop();
                t.AutoReset = false;
                Checkbutton.Text = "Begin";
                MessageBox.Show("Auto Check Stop!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
}

答案 1 :(得分:0)

您的计时器需要在功能范围之外。将前三行移到函数外部。

答案 2 :(得分:0)

因为每次执行问题中的代码都会得到 new 计时器。

大概你的代码就是这样做的:

  1. 构建新计时器
  2. 由于starttrue,因此启动此计时器
  3. 下次执行时,构建一个新计时器(与第一个计时器分开)
  4. 由于startfalse,您要求此新计时器停止,但它从未启动过
  5. 如果您想要停止之前启动的计时器,则需要存储对它的引用,以便您可以访问相同的计时器。

    通常,您会将其存储在周围类的字段中。另外,请确保只构建一次计时器。