2011-05-30 66 views
4

在我的WPF應用程序 - 我有一個與Gridview裏面的ListView。用戶可以將文件添加到此列表中。我可以在WPF中以同步的方式使用多個BackgroundWorker嗎?

在GridView應該讓我有相當豐富的「行」,每行顯示文件名,額外的應用程序的細節,最重要的一個進度條。 gridview中的每一行都是綁定到集合中的業務對象的數據綁定,具體來說,該對象具有綁定到進度條的「Progress」屬性。

我需要處理的每個文件,提取數據,並將數據發送到Web服務,我想,以顯示其各自的進度條,每個文件的進度,我通過文件的收集工作。

最初我開始了與含有定期更新「進度」字段的每一行,並指出,所述UI沒有更新很好處理邏輯一個簡單的循環。

我然後移動在循環處理邏輯,以一個BackgroundWorker其修改的業務對象「進步」領域,因爲UI線程不工作這麼難 - 這是一個很大的響應速度。

然而,由於的BackgroundWorker的異步性,它開始多BackgroundWorkers(每行一個),幾乎所有的在一次作爲紡出的循環。我所有的進度條開始進展...

什麼是最好的方法將它限制在只有2-3個BackgroundWorkers同時進行?甚至把它留在一個BackgroundWorker上 - 直到前一個完成纔開始?我如何引入一個依賴關係,以使所有BackgroundWorkers實質上都是同步的?

+3

如果您希望它們是同步的,那麼爲什麼不創建一個後臺工作人員,以同步方式完成所有工作,而不是將其分成多個工作人員? – 2011-05-30 13:09:49

回答

7

你可以在樣here

+0

感謝您的鏈接 - 自定義調度程序看起來是指定所需並行度的好方法。 – dan 2011-05-30 22:29:26

2

如果你真的只需要一個在同一時間執行使用任務類,像,那麼有幾種方法。您可以使用任務類和TaskScheduler(如他的回答中提供的@oleksii),或者可以將工作元素髮布到隊列中,並讓後臺線程一個接一個地工作。

但是,如果您只想根據當前正在運行的硬件以最佳方式完成工作,那麼我會說將它留給默認的任務調度程序。只要您想爲網格行工作並將計劃安排到.NET,就可以在TaskFactory上調用StartNew

如果你有任務之間的依賴關係,你可以使用ContinueWith overloads之一維護作業之間的順序。

+0

謝謝伊薩克 - 您的評論以上(尷尬明顯:))以及您在這裏給出的額外信息。 – dan 2011-05-30 22:33:47

+0

沒問題。很高興我能幫上忙 – 2011-05-31 05:52:10

相關問題