Windows窗体定时器不会停止.这怎么可能
本文关键字:怎么可能 窗体 定时器 Windows | 更新日期: 2023-09-27 18:04:50
在调试期间,我可以看到Timer.Stop()
或Timer.Enabled = false
命令执行后,定时器仍在运行(定时器。Enabled = true)。这怎么可能呢?
当您停止工作线程上的计时器时,这是可能的。例如:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
Timer timer1;
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
timer1 = new Timer();
timer1.Interval = 3000;
timer1.Start();
var t = new System.Threading.Thread(stopTimer);
t.Start();
}
private void stopTimer() {
timer1.Enabled = false;
System.Diagnostics.Debug.WriteLine(timer1.Enabled.ToString());
}
}
输出:真正的
计时器必须由UI线程停止,类会自动处理它。非常类似于Control.BeginInvoke()。有一个显式的竞争,Tick事件处理程序可以在您停止它之后运行。如果您创建的第一个计时器是在工作线程上创建的,则这种情况也可能发生在UI线程上。例如启动画面。这是不健康的,你应该改正
在您通过调用Stop禁用计时器后调用Start将导致计时器重新启动被中断的间隔。如果你的Timer被设置为5000毫秒的间隔,并且你在3000毫秒左右调用Stop,调用Start将导致Timer等待5000毫秒才引发Tick事件。
也要记住
在Windows窗体应用程序中的任何计时器上调用Stop可以导致来自应用程序中其他计时器组件的消息立即被处理,因为所有计时器组件都在主应用程序线程上操作。如果您有两个Timer组件,一个设置为700毫秒,另一个设置为500毫秒,并且您在第一个Timer上调用Stop,那么您的应用程序可能会首先收到第二个组件的事件回调。如果这证明有问题,请考虑在System中使用Timer类。 http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.stop.aspxpublic void EnableTimer(bool state)
{
if (this.InvokeRequired) {
this.Invoke(new Action<bool>(EnableTimer), state);
} else {
this.Timer1.Enabled = state;
}
}