C# 计时器在停止后仍然运行得更多一点
本文关键字:运行 多一点 计时器 | 更新日期: 2023-09-27 18:34:19
我正在使用Windows表单。我正在使用System.Timers.Timer
.虽然我用timer.Stop()
停止了计时器,但它仍然多了一点点。我放了一些布尔变量来防止这种情况,但没有运气。有人知道吗?谢谢。
timer = new System.Timers.Timer();
timer.Elapsed += OnTimedEvent;
timer.Interval = 1000;
timer.start();
public void cancelConnectingSituation(Boolean result)
{
connecting = false;
timer.Stop();
if (result)
{
amountLabel.Text = "Connected";
}
else
{
amountLabel.Text = "Connection fail";
}
}
private void OnTimedEvent(Object source, ElapsedEventArgs e)
{
if (device.position == 2 && connecting)
{
refreshTime();
setConnectingText();
}
else if (connecting)
{
setConnectingText();
}
else
{
refreshTimeAndAmount();
}
}
触发System.Timers.Timer
Elapsed
事件时,它会在后台ThreadPool
线程上触发。这意味着,当您调用 Stop
时,事件可能已经触发,并且此线程正在排队等待执行。
如果要确保事件在停止计时器后不会触发,则需要(除了布尔变量之外)一个锁:
readonly object _lock = new object();
volatile bool _stopped = false;
void Stop()
{
lock (_lock)
{
_stopped = true;
_timer.Stop();
}
}
void Timer_Elapsed(...)
{
lock (_lock)
{
if (_stopped)
return;
// do stuff
}
}
或者,更简单:
readonly object _lock = new object();
void Stop()
{
lock (_lock)
{
_timer.Enabled = false; // equivalent to calling Stop()
}
}
void Timer_Elapsed(...)
{
lock (_lock)
{
if (!_timer.Enabled)
return;
// do stuff
}
}