C#计时器不会打勾

And*_*rej 10 c# timer winforms

我有一个奇怪的问题......在过去的几个小时里我一直在想不起......我在winform代码中输入的计时器(来自工具栏)不会打勾......

我在我的程序中有两种形式的计时器,它们都工作正常...我尝试完全相同它不会勾选...我选择它,将它拖到一个表单上,启用它,设置间隔和处理滴答事件...没有任何反应...我甚至尝试在tick事件中放置像messagebox.show这样的随机代码,只是为了看看是否有任何事情发生,什么都没有!正如我所说,我的程序中有一些更多的计时器(在其他形式,而不是我试图把这个计时器的那个),他们都工作正常...

有什么建议?

提前致谢!

小智 10

我发现如果我从非UI线程中停止计时器,然后再次启动它,我将失去事件挂钩.

我不知道"正确"的答案是什么,但这对我来说效果很好:

public class BetterTimer : System.Windows.Forms.Timer
{
    public BetterTimer():base()        
    { base.Enabled = true; }

    public BetterTimer(System.ComponentModel.IContainer container) : base(container) 
    { base.Enabled = true; }

    private bool _Enabled;
    public override bool Enabled
    {
        get { return _Enabled; }
        set { _Enabled = value; }
    }

    protected override void OnTick(System.EventArgs e)
    { if (this.Enabled) base.OnTick(e); }
}
Run Code Online (Sandbox Code Playgroud)

这种方法有三点:

1)通过重写构造函数,我确保从一开始就启用基本计时器.

2)通过覆盖"启用",我从不让基本定时器被禁用,但接口不会改变.

3)通过覆盖"OnTick",我让被覆盖的Enabled属性决定事件是否应该触发.

Start()和Stop()分别通过将true和false设置为Enabled属性来工作.

顺便说一句 - 有没有人知道为什么当从非UI线程停止/禁用定时器时,事件永远不会触发(或断开连接?)?

  • 这为我解决了。显然,总是在UI线程上停止/启动System.Windows.Forms.Timer! (2认同)

And*_*rej 7

不要System.Windows.Forms.Timer计时器启动.enabled ...无论如何..我刚刚开始工作......我将视觉工作室生成的代码形式WINFORMNAME.designer.cs复制到WINFORMNAME.cs. ..我不知道如何以及为什么但它有效...

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Enabled = true;
timer.Interval = 1000; 
timer.Tick += new EventHandler(timer_Tick); 
        void timer_Tick(object sender, EventArgs e)
        {
//do something
        }
Run Code Online (Sandbox Code Playgroud)

谢谢大家的答案!


Isa*_*avo 6

确保通过调用timer1.Start()启动它

  • .Enabled = true应该足够了. (2认同)