我正在使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
当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
}
}
Run Code Online (Sandbox Code Playgroud)
或者,甚至更简单:
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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |