如何在计时器中获得估计的输出

时间:2010-06-09 11:47:21

标签: c# timer

我正在与两个计时器合作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace example
{
    public partial class Form1 : Form
    {
        int i = 0;
        int j = 0;
        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 3000;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            i++;
            timer2.Enabled = true;
            if (i < 3)
                time1(i);
            else
                timer1.Enabled = false;


        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            j++;
            timer2.Interval = timer1.Interval / 5;
            if (j < 5)
                time2(j);
            else
                timer2.Enabled = false;

        }

        private void time1(int i)
        {

            MessageBox.Show(i.ToString(), "First Timer");
        }

        private void time2(int j)
        {
            MessageBox.Show(j.ToString(), "SecondTimer");
        }
    }
}

运行此程序时,它会输出如下输出:

  

firsttimer:1个
  secondTimer:1个
  secondTimer:2个
  secondTimer:3个
  secondTimer:4个
  第一时间:2

消息框中的

但是在调试时,调试无法按此顺序移动。完成 secondtimer:2 后,它会回到第一个计时器。但是我需要像没有断点一样以相同的顺序进行调试 我在另一个应用程序中需要这个。为什么会这样?

3 个答案:

答案 0 :(得分:2)

问题是,即使您使用断点停止程序,基础计时器仍将继续执行。您正在使用的System.Windows.Forms.Timer将触发另一个事件(而System.Timers.Timer将继续触发大量事件)。您可以自己尝试:

将计时器设置为例如3000ms并在其事件处理程序中设置断点:

private void timer1_Tick( object sender, EventArgs e )
{
    // insert breakpoint here
}

等待~3秒才能继续你的程序。将立即再次调用事件处理程序。下次等待更长时间(~10秒),结果相同 - 事件处理程序将立即触发一次,然后在~3秒后触发。将行为与System.Timers.Timer进行比较,这将在您的第二个测试用例中多次触发事件。

那么,根据你的断点(你在timer1_Tick之前或之后的timer2.Enabled = true;中设置它吗?)并且在你继续执行之前停止你的程序时你会得到不同的结果。

不幸的是,你无能为力。在你的特殊情况下,你可以在设置断点之前停止所有计时器,例如:

private static void Break()
{
    var timer1Enabled = timer1.Enabled;
    var timer2Enabled = timer2.Enabled;
    timer1.Stop();
    timer2.Stop();
    // insert breakpoint here
    timer1.Enabled = timer1Enabled;
    timer2.Enabled = timer2Enabled;
}

但这会重新启动计时器,timer1和timer2间隔之间的比例会出错。

有关.net计时器的更多信息,请阅读this article

答案 1 :(得分:0)

可能是因为你在调试?

尝试将间隔乘以10,这样您就可以手动密切关注代码,就像没有步进一样。

可怕的英语顺便说一下。我甚至不知道我在这里是否理解你。

答案 2 :(得分:0)

当您调试应用程序时,您不能依赖定时器以正确的间隔触发,因为程序可能在断点处停止。尝试删除所有断点,看看定时器是否在调试时工作。