2012-07-20 81 views
1

這是我寫了一個簡單的代碼:爲什麼Thread.Sleep()以這種方式表現?

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

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

這是爲什麼?

回答

10

這是因爲你讓主線程睡眠。因此無法將新文本繪製到標籤上。

你可以「強制」使用的處理隊列中的(油漆)事件:

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

但是那麼請閱讀this問題

+3

值得注意的是'DoEvents'不是特定於繪製事件,它只是處理隊列中剩餘的任何消息。 – 2012-07-20 09:36:29

2

的時刻「Application.DoEvents()的使用」執行Thread.Sleep時,UI線程正在休眠。因此,負責更新UI的代碼不會執行(只要您的button1_Click方法已返回,就可以執行該代碼),並且您看不到結果。

0

從我所瞭解到的,編譯器選擇哪一行最好先編譯。因此,如果您要評論label1.Text =「秒」,則應在延遲1秒後在您的標籤中顯示「第一個」。 可以證明,通過這樣做:

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

,它仍然會顯示「第二」,因爲label1.Text設置爲「第一」,但過短,因爲它的睡眠這就是後會發生,爲什麼你不能看見。

相關問題