Windows窗体定时器不会停止.这怎么可能

本文关键字:怎么可能 窗体 定时器 Windows | 更新日期: 2023-09-27 18:04:50

在调试期间,我可以看到Timer.Stop()Timer.Enabled = false命令执行后,定时器仍在运行(定时器。Enabled = true)。这怎么可能呢?

Windows窗体定时器不会停止.这怎么可能

当您停止工作线程上的计时器时,这是可能的。例如:

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.aspx

public void EnableTimer(bool state)
{
    if (this.InvokeRequired) {
        this.Invoke(new Action<bool>(EnableTimer), state);
    } else {
        this.Timer1.Enabled = state;
    }
}