2013-01-07 51 views
2

在我的c#winform應用程序中,我有一個按鈕,單擊它時,它會執行一些可能需要一些時間的計算。c#winforms events

我也有一個label.visible = false我想label.visible = true右按鈕後單擊,以便用戶可以看到應用程序工作。

即使label.visible = truebutton1_Click(object sender, EventArgs e)方法中的第一件事情,它只在執行計算後才切換到可見狀態。

如何在button_click後顯示標籤?

回答

1

有幾種方法可以解決這個問題。

一種方法(簡單的)是調用

this.Refresh(); 

之後,你的標籤設置爲可見。

另一個是在後臺線程中進行計算。最簡單的方法是使用BackgroundWorker。然後,您的主線程可以繼續爲UI提供服務(刷新窗體,響應按鈕等),而後臺工作線程執行計算。

有關後臺工作線程的更多信息,請參閱http://www.dotnetperls.com/backgroundworker

+1

是的,刷新工作正常,但我會繼續前進,並將代碼更改爲backgroundworker,因爲它更整潔,並且不會掛起UI。謝謝 –

4

如果你需要你的應用程序通過調用,而你的應用程序的處理是保持響應,看看Background Worker

您可以強制表單更新&過程中的任何背景信息:

Application.DoEvents(); 

剛在您更改了標籤後 - 儘管這可能是一種拙劣的解決方案。

+0

你真的應該把'BackgroundWorker'放在最上面,並且不鼓勵'DoEvents'。看看http://stackoverflow.com/questions/5181777/use-of-application-doevents –

+0

是的 - 我同意其實。 –

2

您的計算正在UI線程上執行。這意味着在設置了標籤的可見性後,它會阻止UI重新壓縮。 您應該考慮使用任務在另一個線程上執行計算。這將允許用戶界面在看起來可以在後臺運行的長時間操作期間作出響應。

例如

var taskCalc = Task.Factory.StartNew(() => //Do Calculation); 
1

像其他人一樣說:你正在UI線程上執行你的工作。我向你展示了實現你所需要的另一種有效方式。您可以使用匿名委託將工作移至單獨的線程。

(new System.Threading.Thread(() => 
     { 
      dowork(); // What ever work you need put here. 
     })).Start(); 
+0

上面的代碼,它可以去哪裏?或者無所謂,它可以在button_click方法中,因爲它由另一個線程運行? –

+0

您可以在button_Click方法中運行它。或者創建一個新方法並從button_Click方法調用它。 – Botonomous