这是我写的一个简单的代码:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "first";
Thread.Sleep(1000);
label1.Text = "second";
}
但标签从不显示“第一”。我使用断点进行了检查,语句 label1.text="first" 被执行但不在标签中显示“第一”,只显示“第二”。
为什么会这样?
这是我写的一个简单的代码:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "first";
Thread.Sleep(1000);
label1.Text = "second";
}
但标签从不显示“第一”。我使用断点进行了检查,语句 label1.text="first" 被执行但不在标签中显示“第一”,只显示“第二”。
为什么会这样?
那是因为你让主线程休眠了。因此无法将新文本绘制到标签上。
您可以使用以下方法“强制”处理队列中的(绘制)事件:
Application.DoEvents();
Thread.Sleep(1000);
但是,请阅读这个问题'Use of Application.DoEvents()'
在执行的那一刻Thread.Sleep
,UI 线程正在休眠。因此,负责更新 UI 的代码不会执行(它可以在您的button1_Click
方法返回时执行)并且您看不到结果。
据我所知,编译器会选择最适合首先编译的行。因此,如果您要评论 label1.Text = "second" 它应该在 1 秒延迟后在您的标签中显示 "first"。你可以通过这样做来证明:
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "first";
Thread.Sleep(1000);
if (label1.Text == "first")
{
label1.Text = "second";
}
}
它仍然会显示“第二”,因为 label1.Text 设置为“第一”但太短,因为它发生在睡眠之后,这就是你看不到它的原因。