2010-03-28 82 views
1

我有一個窗體形式就像這樣:1)點擊按鈕將執行一個需要很長時間才能完成的操作,2)顯示正在進行多少百分比的標籤。如何顯示長時間使用功能的進度狀態?

在我提到的長操作中,我編寫代碼來更新標籤的Text屬性,但它不起作用!

請幫我正確顯示進度狀態。

+1

你需要向我們展示你寫的一些代碼。你如何更新函數中的文本屬性? – 2010-03-28 14:01:55

回答

4

您可以查看BackgroundWorker類(請參閱MSDN overview)。它允許您在後臺運行一些長時間運行的操作並報告進度更新(百分比)以及從後臺任務到用戶界面的完成情況。請注意,您需要自己計算進度百分比。

然而,BackgroundWorker類負責其他棘手的方面,例如將進度報告發送到主GUI線程(您可以安全地更新用戶界面)。

2

您將要創建一個執行任務的工作線程,並偶爾將其更新報告給窗體線程。如果您在UI線程中完成所有工作,則您的UI將被鎖定,並且不會正確更新進度/標籤。

在啓動工作線程之前,請計算您認爲該進程需要執行的總步驟數。啓動工作線程。在每個工作單元之後,您在UI線程上調用更新方法來增加進程。

你會想看看BackgroundWorker類。

如果您的應用程序將具有其中幾個,我建議創建一個過程接口(例如IProgressProcess)。該接口將包含執行過程和報告更新的方法。您將通過從此界面實施來創建所有流程類。編寫一個包含進度條並通過構造函數或屬性接受IProgressProcess的控件。然後,它可以使用您的自定義流程執行並沿着進度條移動。然後,您可以讓您的自定義進度控制在流程完成或取消時發送事件。

1

如果您嘗試在發生操作的同一線程上更新UI,通常會發生這種情況。有幾種不同的方法可以實現這一點。

  1. 您可以使用BeginInvoke方法更新UI。可以使用BackgroundWorker組件。
1

您沒有看到任何更改的原因是該更改會導致消息重新繪製標籤,但主線程正忙於工作,因此它不響應該消息。

最簡單的解決方案是在更新標籤後調用Application.DoEvents。這可以快速解決您的緊急問題,但它仍然會以其他任何方式使應用程序無響應。

好的解決方案是在單獨的線程中開始操作。這樣,您的主線程可以在操作運行時自由處理消息。然而,在單獨的線程中工作意味着在與UI進行通信時需要更多的工作。如果要更新控件,則必須使用Invoke方法來啓動在主線程中運行的方法,以便它可以訪問控件。或者,您可以更新線程中的變量,並擁有一個定時器控件,用於定期檢查變量中的更改並相應地更新標籤。

相關問題