【发布时间】:2019-01-26 05:06:20
【问题描述】:
我不确定这段代码有什么问题。 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 上?谢谢。
【问题讨论】:
-
因为 UI 在消息泵运行之前不会更新。您可以通过将
Application.DoEvents()添加到循环主体来强制执行此操作,但强烈建议不要这样做。请查看this quesiton 了解更多信息。 -
它不会在 5 处停止,因为您有一个
do..while循环,而不是while循环 -
如果我是你,我会使用调试器并逐行执行代码。在
timer1_Tick中,在while语句之后放置一个断点。观察value(它是 6,因为这是第一个 not timer1_Tick 的顶部放置一个断点。继续运行。一秒钟后它将在顶部。观察value(仍然是6)。单步执行代码。注意do..while循环的主体已运行(因为它还没有达到while条件)...... -
我认为,与其在
Tick事件中循环更新值,不如只更新一次。但首先检查它是否已经是5,如果是,则停止计时器。比如:if (value < 5) label1.Text = ++value.ToString(); else timer1.Stop();