Windows窗体计时器不会停止.怎么可能?

Pet*_*r17 4 .net c# debugging timer winforms

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

Han*_*ant 7

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

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

必须由UI线程停止计时器,该类自动处理它.与Control.BeginInvoke()非常相似.有一个明确的竞争,Tick事件处理程序可以在你停止后运行.如果您创建的第一个计时器是在工作线程上创建的,那么这也可能发生在UI线程上.例如一个闪屏.这不健康,你应该解决这个问题.