當您使用進度條時,它是否在UI線程中運行?我問,因爲我想知道如何在UI線程上運行的冗長任務顯示進度條。在Windows窗體中使用進度條時,「冗長進程」是否必須在非UI線程上運行?
我有一些窗戶,需要一段時間才能敞開心扉,完全呈現,我會喜歡的東西,以指示某些事情正在發生的用戶。他們中的一些人不耐煩,如果UI在1/4秒內無響應,他們就會像瘋了一樣點擊。
I.E.漫長的過程不一定是我想在後臺線程中運行的東西。那麼如何在這種情況下顯示進度條?
當您使用進度條時,它是否在UI線程中運行?我問,因爲我想知道如何在UI線程上運行的冗長任務顯示進度條。在Windows窗體中使用進度條時,「冗長進程」是否必須在非UI線程上運行?
我有一些窗戶,需要一段時間才能敞開心扉,完全呈現,我會喜歡的東西,以指示某些事情正在發生的用戶。他們中的一些人不耐煩,如果UI在1/4秒內無響應,他們就會像瘋了一樣點擊。
I.E.漫長的過程不一定是我想在後臺線程中運行的東西。那麼如何在這種情況下顯示進度條?
你可以使用Application.DoEvents()
在GUI線程,讓進度條進行更新,但是這是氣餒由於再入問題和性能。
你最好的選擇確實是一個後臺線程。
這使得在.NET框架中使用System.Threading.BackgroundWorker
類特別容易。 Msdn help on backgroundworkers
如果它是一個長期運行的操作,它屬於在後臺線程。但是,如果它的主要操作是與UI元素進行交互的操作,則可能會延遲一段時間。
但是,請注意,從UI分離進程(MVC)可能是可行的,因爲它可以在後臺線程上運行,所以無論如何,這對於應用程序的設計都是健康的。
謝謝。這說得通。該過程主要涉及與UI的交互,所以我只想要一個「保持你的馬匹」指標。 – richard 2011-05-19 18:29:23
在這種情況下,您將無法使用進度欄,因爲您無法更新它。即使您以編程方式更改其進度,除非您的方法完成,否則這不會影響用戶界面。您可以添加某種「請稍等」的標籤,但這意味着要找到一種方法讓UI呈現在代碼中間運行的機會。也許Invalidate方法? http://msdn.microsoft.com/en-us/library/598t492a.aspx重繪可能不會發生,直到你的方法完成,但。 – 2011-05-19 22:43:35
我明白了。即使顯示動畫GIF也沒問題。我可以這樣做嗎? – richard 2011-05-19 23:26:33
您可以運行在UI線程上的冗長的任務,並顯示在同一時間的進度條。
但是,您將失去進度條上的Win7/Vista動畫,並且如果您不運行五秒鐘的消息循環,Windows會將您的應用標記爲「無響應」。
可以從BackgroundWorker
(它有它的特殊事件)以及在UI線程上運行的函數更新進度條。在後一種情況下,我傳入一個可以調用的委託來更新進度欄。其他
一兩件事:如果你在UI線程上運行,則無法實現一個取消按鈕,可以輕鬆地,因爲你的消息泵被阻止。
所以我建議一個BackgroundWorker
更長的任務,對於短期任務加布在他的評論中提出了一個閃屏可能會做。
我如何在UI線程中執行冗長的任務的同時運行進度條或選取框? – richard 2011-05-19 18:30:37
您可以在不阻止UI線程的情況下打開窗口。有關更多詳細信息,請從我對這裏相關問題的回答開始:http://stackoverflow.com/questions/5398084/how-to-implement-progress-using-ienumerable/5398198#5398198 – 2011-05-19 18:35:32
啓動畫面是否工作? – Gabe 2011-05-19 18:13:47
@加貝:不知道你的意思。這不僅僅是當他們打開應用程序時。我希望在屏幕上放置很多屏幕。像一個簡單的選框。 – richard 2011-05-19 18:16:51