C#中的定时器问题

时间:2011-05-29 17:06:02

标签: c# .net winforms timer

我在项目中使用了两个System.Windows.Forms.Timer对象,如下所示。

private void Form1_Load(object sender, EventArgs e)
{
    timer1.Interval = 60000;
    timer2.Interval = 62000;
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    Console.WriteLine("Timer1 :" + DateTime.Now.ToString());
    timer2.Start();
}

private void timer2_Tick(object sender, EventArgs e)
{  
    Console.WriteLine("Timer2 :" + DateTime.Now.ToString());
    timer2.Stop();
}

输出结果为:

Timer1 :05/30/2011 12:15:57 AM      (12:16:59)
Timer1 :05/30/2011 12:16:57 AM      (12:17:59) miss
Timer2 :05/30/2011 12:16:59 AM      

Timer1 :05/30/2011 12:17:57 AM      (12:18:59)
Timer1 :05/30/2011 12:18:57 AM      (12:19:59) miss
Timer2 :05/30/2011 12:18:59 AM

Timer1 :05/30/2011 12:19:57 AM      (12:20:59)
Timer1 :05/30/2011 12:20:57 AM      (12:21:59) miss
Timer2 :05/30/2011 12:20:59 AM

我无法理解为什么timer2的timer1每次都缺少一次。

我的意思是Timer2应该在12:17:59开始,Timer1从上午12:16:57开始。

如何更改它以获得正确的算法?

4 个答案:

答案 0 :(得分:5)

我不确定你为什么要这样做,但它正如你设计的那样工作。当timer1滴答时,它会输出一条消息并打开timer2。然后timer1再次打勾,但是timer2已经打开,所以没有任何反应。然后timer2滴答并关闭。这就是为什么你为每个timer2获得两个timer1s。第二次尝试打开Timer2时,Timer2已经在运行。

如果你真的想让它正常工作,你可能需要添加第三个计时器,然后在两者之间交替。检查timer2是否正在运行,如果是,则启动timer3。否则启动timer2。

答案 1 :(得分:3)

如果计时器已经Timer.Start(),则

Enabled不执行任何操作。这不是某种“重启”。所以,timer2.Start()在12:16:57什么也没做。

答案 2 :(得分:3)

您实际上尝试使用计时器实现什么模式?尝试绘制一个显示每个事件及其之间延迟的时序图。输出是预期的:Timer2在第二个Timer1滴答后2秒触发,因为它与Timer1同时启动,只运行了60秒。

答案 3 :(得分:2)

每次发生timer2事件时,您都会重新启动timer1_Tick,请使用以下命令:

private bool timer2Started;
private void timer1_Tick(object sender, EventArgs e)
{
    Console.WriteLine("Timer1 :" + DateTime.Now.ToString());
    if (!timer2Started) { timer2.Start(); timer2Started = true; }
}