我的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();
然后当我重新启动计时器时,它会每秒向我的列表框打印两个测试。
如何正确启动和停止计时器,以便当我取消勾选复选框并再次重新检查时,它不会运行两次?
答案 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";
}
}