2015-04-29 29 views
0

嗨我一直試圖添加一個按鈕到我的程序,當你點擊按鈕時,它顯示標籤中的文本,等待,使用戶可以閱讀它,然後退出程序。但如果我運行它並嘗試它,它只會等待,然後退出而不顯示文本。對不起,如果這是一個不好的解釋,我剛剛進入編碼。這是我的。試圖讓標籤顯示文本,等待,然後關閉程序(C#)

private void button3_Click(object sender, EventArgs e) 
{ 
    label1.Text = "Text Here"; 
    Thread.Sleep(500); 
    this.Close(); 
} 

回答

3

致電label1.Invalidate()強制重新繪製控件。當您撥打Thread.Sleep時,UI線程將被阻止並不會更新。

如果這不起作用,嘗試label1.Refresh()Application.DoEvents();

private void button3_Click(object sender, EventArgs e) 
{ 
    label1.Text = "Text Here"; 
    label1.Invalidate(); 
    Thread.Sleep(500); 
    this.Close(); 
} 

一個更理想的解決辦法是使用一個計時器,另一個線程,或某種異步事件的從你的UI單獨運行代碼:

timer = new Timer(); 
timer.Interval = 500; 
timer.Tick += (sender, e) => Close(); 
timer.Start(); 

new Thread(delegate() { 
    Thread.Sleep(500); 
    this.Close(); 
}).Start(); 

還要注意塔t 500毫秒是相當短的時間,你的意思是5000毫秒,相當於5秒?您可能還想看看Winforms: Application.Exit vs Enviroment.Exit vs Form.Close,因爲Close()關閉當前窗口。

+0

5000毫秒是5秒... –

+0

錯字:)固定... – Cyral

1

而不是使用Thread.Sleep阻止UI線程(並防止它與您的文本更新),它更好地保持UI響應。這將保持用戶界面的工作和延遲,然後關閉應用程序。

private void button3_Click(object sender, EventArgs e) 
{ 
    label1.Text = "Text Here"; 
    Task.Delay(5000).ContinueWith((arg) => Application.Exit()); 
} 

Task在另一個線程運行時,用於指定毫秒(5000秒或5秒在此情況下)的延遲,然後用一個呼叫繼續關閉該應用程序。

順便說一下,this.Close()只有在您運行它的表單是應用程序的「初始」形式時纔會關閉應用程序。如果您從另一個子窗體運行相同的代碼,它只會關閉窗體。如果您想實際關閉應用程序,則更好的方法是使用Application.Close()方法。這會優雅地關閉應用程序。如果你想向下 - 終止,你可以使用Environment.Exit(int)

相關問題