2011-05-19 55 views
1

當您使用進度條時,它是否在UI線程中運行?我問,因爲我想知道如何在UI線程上運行的冗長任務顯示進度條。在Windows窗體中使用進度條時,「冗長進程」是否必須在非UI線程上運行?

我有一些窗戶,需要一段時間才能敞開心扉,完全呈現,我會喜歡的東西,以指示某些事情正在發生的用戶。他們中的一些人不耐煩,如果UI在1/4秒內無響應,他們就會像瘋了一樣點擊。

I.E.漫長的過程不一定是我想在後臺線程中運行的東西。那麼如何在這種情況下顯示進度條?

+0

啓動畫面是否工作? – Gabe 2011-05-19 18:13:47

+0

@加貝:不知道你的意思。這不僅僅是當他們打開應用程序時。我希望在屏幕上放置很多屏幕。像一個簡單的選框。 – richard 2011-05-19 18:16:51

回答

2

你可以使用Application.DoEvents()在GUI線程,讓進度條進行更新,但是這是氣餒由於再入問題和性能。
你最好的選擇確實是一個後臺線程。
這使得在.NET框架中使用System.Threading.BackgroundWorker類特別容易。 Msdn help on backgroundworkers

+0

運行冗長任務的後臺線程?所以你說我需要花費很長的時間並在後臺線程中運行它? – richard 2011-05-19 18:18:44

+0

這將是理想的解決方案。但是我明白你的不情願是由於使用線程時產生的額外問題。 :) – Mr47 2011-05-19 18:19:46

+0

這和事實,我需要重新做一堆屏幕,所以他們在後臺運行他們的進程。 。 。 – richard 2011-05-19 18:21:07

2

如果它是一個長期運行的操作,它屬於在後臺線程。但是,如果它的主要操作是與UI元素進行交互的操作,則可能會延遲一段時間。

但是,請注意,從UI分離進程(MVC)可能是可行的,因爲它可以在後臺線程上運行,所以無論如何,這對於應用程序的設計都是健康的。

+0

謝謝。這說得通。該過程主要涉及與UI的交互,所以我只想要一個「保持你的馬匹」指標。 – richard 2011-05-19 18:29:23

+0

在這種情況下,您將無法使用進度欄,因爲您無法更新它。即使您以編程方式更改其進度,除非您的方法完成,否則這不會影響用戶界面。您可以添加某種「請稍等」的標籤,但這意味着要找到一種方法讓UI呈現在代碼中間運行的機會。也許Invalidate方法? http://msdn.microsoft.com/en-us/library/598t492a.aspx重繪可能不會發生,直到你的方法完成,但。 – 2011-05-19 22:43:35

+0

我明白了。即使顯示動畫GIF也沒問題。我可以這樣做嗎? – richard 2011-05-19 23:26:33

0

您可以運行在UI線程上的冗長的任務,並顯示在同一時間的進度條。

但是,您將失去進度條上的Win7/Vista動畫,並且如果您不運行五秒鐘的消息循環,Windows會將您的應用標記爲「無響應」。

可以從BackgroundWorker(它有它的特殊事件)以及在UI線程上運行的函數更新進度條。在後一種情況下,我傳入一個可以調用的委託來更新進度欄。其他

一兩件事:如果你在UI線程上運行,則無法實現一個取消按鈕,可以輕鬆地,因爲你的消息泵被阻止。

所以我建議一個BackgroundWorker更長的任務,對於短期任務加布在他的評論中提出了一個閃屏可能會做。

+0

我如何在UI線程中執行冗長的任務的同時運行進度條或選取框? – richard 2011-05-19 18:30:37

+0

您可以在不阻止UI線程的情況下打開窗口。有關更多詳細信息,請從我對這裏相關問題的回答開始:http://stackoverflow.com/questions/5398084/how-to-implement-progress-using-ienumerable/5398198#5398198 – 2011-05-19 18:35:32

相關問題