C#中的计时器行为很奇怪

时间:2019-01-25 20:42:04

标签: c# loops timer

我不确定这段代码有什么问题。 timer1间隔设置为1000。

namespace timerbug
{
    public partial class Form1 : Form
    {
        int value;

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            do
            {
                value++;
                label1.Text = value.ToString();
            }
            while (value <= 5);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            value = 0;
            timer1.Start();
        }
    }
}

我认为标签将显示1到5,然后停止。直到6点才开始计数,直到我停止程序后才继续计数。有人可以解释为什么数字1到5没有显示,然后为什么没有在5处停止吗?谢谢。

2 个答案:

答案 0 :(得分:1)

正如其他人在注释中正确指出的那样,它停在6而不是5,因为6value <= 5评估为假的第一个值(您正在使用do-while循环,这意味着条件在执行主体后进行评估。)为了在5处停止,您可以使用常规的while循环,也可以将条件更改为value < 5value <= 4

此外,C#中循环的6次迭代在几微秒内发生。即使其他步骤都正确完成,您也无法真正看到标签上显示的数字,这仅仅是因为它发生得太快了。为了看到发生的任何事情,您需要引入某种延迟(Thread.Sleep()),并且在每次迭代结束时,都必须调用Application.DoEvents()来重新绘制Form。

或者,您可以使用Timer的刻度,在大多数情况下会更可取。例如,您可以这样做。

namespace timerbug
{
    public partial class Form1 : Form
    {
        int value;

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (value < 5)
            {
                value++;
                label1.Text = value.ToString();
            }
            else
            {
                timer1.Stop();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            value = 0;
            timer1.Start();
        }
    }
}

答案 1 :(得分:0)

将timer1_tick代码更改为此可以正常工作,谢谢您的帮助。我有很多东西要学。

        value++;

        if (value >= 5)
        {
            timer1.Stop();
        }

            label1.Text = value.ToString();
            label1.Invalidate();
            label1.Update();

        }