gpt4 book ai didi

C# Timer elapsed 在停止后仍然运行多一点

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:29 29 4
gpt4 key购买 nike

我正在使用 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();
}
}

最佳答案

当触发 System.Timers.Timer Elapsed 事件时,它会在后台 ThreadPool 线程上触发。这意味着,当您调用 Stop 时,一个事件可能已经触发并且该线程已排队等待执行。

如果你想确保你的事件在你停止计时器后不会触发,你将需要(除了你的 bool 变量)一个锁:

 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
}
}

关于C# Timer elapsed 在停止后仍然运行多一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35349971/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com