我正在使用Windows窗体。我正在使用System.Timers.Timer
。虽然我用timer.Stop()
停止了计时器,但它仍然会更多。我放了一些bool变量来防止这个,但没有运气。有人知道吗?
谢谢。
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();
}
}
答案 0 :(得分:5)
当触发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
}
}