我创建一个窗口表单应用程序,按下按钮每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);
}
答案 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 计时器。
大概你的代码就是这样做的:
start
为true
,因此启动此计时器start
是false
,您要求此新计时器停止,但它从未启动过如果您想要停止之前启动的计时器,则需要存储对它的引用,以便您可以访问相同的计时器。
通常,您会将其存储在周围类的字段中。另外,请确保只构建一次计时器。