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将使其始终发生。。。