簡體   English   中英

為什么 Thread.Sleep() 會這樣?

[英]Why does Thread.Sleep() behave in this way?

這是我寫的一個簡單的代碼:

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

但標簽永遠不會顯示“第一”。 我使用斷點檢查並且語句 label1.text="first" 被執行但沒有在標簽中顯示 'first',只顯示 'second'。

為什么會這樣?

那是因為你讓主線程休眠。 因此無法將新文本繪制到標簽上。

您可以使用以下命令“強制”處理隊列中的(繪制)事件:

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

但是,請閱讀問題“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";
    }
}

它仍然會顯示“second”,因為 label1.Text 設置為“first”但太短,因為它發生在睡眠之后,這就是為什么你看不到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM