【问题标题】:Why does Thread.Sleep() behave in this way?为什么 Thread.Sleep() 会这样?
【发布时间】:2012-07-20 09:30:50
【问题描述】:

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

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

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

为什么会这样?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

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

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

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

    不过,请阅读this question 'Use of Application.DoEvents()'

    【讨论】:

    • 值得注意的是,DoEvents 并不特定于绘制事件,它只是处理队列中剩余的任何消息。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 2011-06-03
        • 2018-06-08
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多