2012-10-24 49 views
0

讀這些BackgroundWorker vs. ThreadPool vs. Thread提示,我決定用BackgroundWorker去。創建多個(超過10個)BackgroundWorkers的建議方法是什麼?

我知道如何通過從工具箱拖放它的組件到我的窗體中來創建這樣的線程,但是因爲我需要多個這樣的線程(有限數字在10-20之間),所以我不確定什麼是解決這個正確的方法是:

  • 拖放他們10-20,代碼爲他們創造的佔位符,但只啓動那些需要運行,根據應用需求(在不同情況下,我可以爲運行這些10-20線程中的1-2個我們)。

我喜歡拖和下降的方法,但我不是BackgroundWorker的經歷,我不知道這種權衡可能是什麼。

來自有經驗的BackgroundWorker程序員的任何提示?

+4

您是否也考慮過任務(.NET 4)? –

+0

@Mudu沒有任何優於BackgroundWorkers的優勢? – ateiob

+2

這將有助於瞭解工人會做什麼。 –

回答

1

您可以創建一個包含它們的數組。爲每個你添加一個處理程序。完成後,通過數組來處置它們。例如(抱歉,這是從VB代碼翻譯,我不是專家在C#所以請僞代碼在最壞的情況都把):

//globally 
List<BackgroundWorker> workers = new List<BackgroundWorker>(); 

//within a sub/function 
int numberOfWorkersNeeded = 10; 
for (i = 0; i < numberOfWorkersNeeded; i++) { 
    BackgroundWorker bg = new BackgroundWorker(); 
    bg.DoWork += new DoWorkEventHandler(MyWorkHandler); 
    bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(MyWorkFinishedHandler); 
    workers.Add(bg); 
} 

要刪除(它們是可重複使用,所以這是當退出或當您不需要再工人):

for (i = 0; i < workers.Count; i++) { 
    if (!bg.IsBusy) { 
     //remove handlers 
     workers(i).Dispose(); 
    } 
} 

權衡作爲@ateiop說,你需要手動創建(和刪除)的事件處理程序。

對於BackgroundWorker您有兩個主要事件DoWorkRunWorkerCompleted。另外,如果您想報告進度,則需要啓用報告(bg.WorkerReportsProgress = true;)併爲其添加處理程序(ProgressChanged)。

無論如何,您還需要處理尚未完成的工作。

+4

奇怪的C#和VB在這裏混合.... – Servy

+0

抱歉,由vb翻譯。 – K3N

+0

+1代表實際的代碼示例以編程方式創建BackgroundWorkers。這也許是被接受的答案(除非有更好的結果),但是我喜歡拖放方法,您可以通過雙擊來定義/訪問其所有事件處理程序。在這裏,我不知道我是否錯過了什麼? – ateiob

相關問題