2010-05-18 54 views
0

我正在使用C#.net,Windows應用程序,我想使用按鈕中的Progressbar而不使用BackGroundworker,任何人都可以建議,在此先感謝....... .............,我試過使用線程,For循環迭代,如何在按鈕中使用Progressbar而不使用BackGroundworker

+0

你能詳細闡述一下你想達到的更多的東西嗎?通過給定的細節,我得到你想顯示進度條上點擊一個按鈕,我是正確的! – Malcolm 2010-05-18 07:22:35

回答

2

快速回答非常接近「你不能」。

較長的答案是:

理論上你可以簡單地啓動一個進度條,然後對()循環中更新。

但是,這在實踐中並不奏效。原因是當你在你的循環中時,你的應用程序是「繁忙的」,並且它不響應來自操作系統的窗口消息。操作系統會注意到這一點,並決定你沒有反應,所以它會拍攝一個窗口的快照。從那時起,無論何時更新進度條,操作系統都會顯示快照而不是當前狀態,因此就用戶而言,進度條移動到(例如)35%,然後剛剛「卡住」 。這完全擊敗了進度條!

要解決這個問題,您的UI線程必須處理消息。有兩種方法可以完成。

1)爲處理作業使用單獨的線程,並要求UI線程更新進度欄。這是「背景工作者」的方法,它運作良好。

2)您可以在固定的for()循環內調用Application.DoEvents()。這可以讓您在「忙碌」時發送消息,從而避免出現問題。但是,這是非常危險的,因爲處理消息會導致重新調用您的代碼(例如,如果您單擊「開始」按鈕開始處理,用戶將能夠再次單擊「開始」,然後嘗試執行處理中的一些處理)。爲了解決這個問題,你必須非常小心,安裝一個MessageFilter來確保你在這個上下文中只處理「安全」消息。除非你真的知道你在做什麼,否則不要嘗試這種方法。

因此,只有一種實用方法:使用BackgroundWorker(或您自己的線程)。有很多關於如何在網絡上做這個的教程,所以我不會在這裏詳細說明這個方法。