如何停止和启动计时器?
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;
仅在您的应用程序中完成一次。一旦事件被挂钩,则不再需要绑定。
以上是关于如何停止和启动计时器?的主要内容,如果未能解决你的问题,请参考以下文章