1

这是我写的一个简单的代码:

private void button1_Click(object sender, EventArgs e)
{
    label1.Text = "first";
    Thread.Sleep(1000);
    label1.Text = "second";
}

但标签从不显示“第一”。我使用断点进行了检查,语句 label1.text="first" 被执行但不在标签中显示“第一”,只显示“第二”。

为什么会这样?

4

3 回答 3

10

那是因为你让主线程休眠了。因此无法将新文本绘制到标签上。

您可以使用以下方法“强制”处理队列中的(绘制)事件:

Application.DoEvents();
Thread.Sleep(1000);

但是,请阅读这个问题'Use of Application.DoEvents()'

于 2012-07-20T09:32:08.427 回答
2

在执行的那一刻Thread.Sleep,UI 线程正在休眠。因此,负责更新 UI 的代码不会执行(它可以在您的button1_Click方法返回时执行)并且您看不到结果。

于 2012-07-20T09:32:21.990 回答
0

据我所知,编译器会选择最适合首先编译的行。因此,如果您要评论 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 设置为“第一”但太短,因为它发生在睡眠之后,这就是你看不到它的原因。

于 2012-07-20T09:47:04.737 回答