为什么Thread.Sleep()以这种方式运行?

时间:2012-07-20 09:30:50

标签: c# multithreading

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

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

但标签从不显示'第一'。我使用断点检查并且语句label1.text =“first”被执行但是在标签中没有显示“first”,只显示“second”。

为什么会这样?

3 个答案:

答案 0 :(得分:10)

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

您可以使用以下命令“强制”处理队列中的(paint)事件:

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

然而,请阅读this问题'使用Application.DoEvents()'

答案 1 :(得分:2)

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

答案 2 :(得分: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设置为“first”但是太短,因为它发生在睡眠之后,这就是为什么你看不到它。