我不确定这段代码有什么问题。 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处停止吗?谢谢。
答案 0 :(得分:1)
正如其他人在注释中正确指出的那样,它停在6
而不是5
,因为6
是value <= 5
评估为假的第一个值(您正在使用do-while
循环,这意味着条件在执行主体后进行评估。)为了在5
处停止,您可以使用常规的while
循环,也可以将条件更改为value < 5
或value <= 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();
}