Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows窗体计时器没有';不要停下来。这怎么可能?_C#_.net_Winforms_Debugging_Timer - Fatal编程技术网

C# Windows窗体计时器没有';不要停下来。这怎么可能?

C# Windows窗体计时器没有';不要停下来。这怎么可能?,c#,.net,winforms,debugging,timer,C#,.net,Winforms,Debugging,Timer,在调试期间,我可以看到在执行Timer.Stop()或Timer.Enabled=false命令后,计时器仍在运行(Timer.Enabled=true)。这怎么可能 通过调用Stop禁用计时器后调用Start将导致计时器重新启动中断的间隔。如果您的计时器设置为5000毫秒间隔,并且您在3000毫秒左右调用Stop,则调用Start将导致计时器在引发滴答事件之前等待5000毫秒 还要记住 在Windows窗体应用程序中的任何计时器上调用Stop都会导致立即处理来自应用程序中其他计时器组件的消息,

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

通过调用Stop禁用计时器后调用Start将导致计时器重新启动中断的间隔。如果您的计时器设置为5000毫秒间隔,并且您在3000毫秒左右调用Stop,则调用Start将导致计时器在引发滴答事件之前等待5000毫秒

还要记住

在Windows窗体应用程序中的任何计时器上调用Stop都会导致立即处理来自应用程序中其他计时器组件的消息,因为所有计时器组件都在主应用程序线程上运行。如果您有两个计时器组件,一个设置为700毫秒,另一个设置为500毫秒,并且在第一个计时器上调用Stop,那么您的应用程序可能会首先收到第二个组件的事件回调。如果这证明是有问题的,考虑使用系统中的定时器类。线程命名空间代替。
当您停止工作线程上的计时器时,这是可能的。例如:

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线程上。例如,启动屏幕。这是不健康的,你应该修复它。

public void EnableTimer(bool状态)
public void EnableTimer(bool state)
{
    if (this.InvokeRequired) {
        this.Invoke(new Action<bool>(EnableTimer), state);
    } else {
        this.Timer1.Enabled = state;
    }
}
{ if(this.invokererequired){ 调用(新操作(EnableTimer),状态); }否则{ this.Timer1.Enabled=状态; } }

尝试此代码…

您可能应该显示一些代码,除了代码之外,您如何启动它?@gbianchi如何在代码旁边启动它?我在一个位置启动它,并想在另一个位置停止它,但它不会停止。@Oscar,您可以将它设置为在设计时启动。。在控件上启用true将使其始终发生。。。