我正在使用C#.NET。它是一個GUI應用程序。當用戶點擊一個按鈕時,工作被分配給4個不同的後臺工作人員。每個人花費不同的時間,最終的結果是他們填充了一些變量。如何在.NET中完成所有線程(backgroundWorkers)的作業時調用方法
我需要調用一個方法,對每個bgwoeker的這些最終結果進行操作並給出最終輸出。如何做到這一點?
這裏的問題是要確保所有bg工人都完成了他們的工作。
我正在使用C#.NET。它是一個GUI應用程序。當用戶點擊一個按鈕時,工作被分配給4個不同的後臺工作人員。每個人花費不同的時間,最終的結果是他們填充了一些變量。如何在.NET中完成所有線程(backgroundWorkers)的作業時調用方法
我需要調用一個方法,對每個bgwoeker的這些最終結果進行操作並給出最終輸出。如何做到這一點?
這裏的問題是要確保所有bg工人都完成了他們的工作。
您可以製作計數器並從每個BackgroundWorker的RunWorkerCompleted eventhandler中檢查它,或從每個BackgroundWorker的RunWorkerCompleted中檢查其他3個Backgroundworkers的狀態。
您可以在一個類中封裝此功能:
public class Synchronizer {
private List<Action> workers = new List<Action>();
public List<Action> Workers { get { return workers; } }
public void Run(Action callBackOnDone) {
var workers Workers.ToArray();
object syncRoot = new object();
int counter = workers.Length;
foreach(var worker in workers) {
ThreadPool.QueueUserWorkItem(()=> {
try { worker(); }
finally {
lock(syncRoot) {
counter--;
if (counter <= 0) {
callBackOnDone();
}
}
}
});
}
}
}
1)如果你是實際執行您希望完成工作,不要使用後臺工作,使用正確的線程或以上,使用線程池。
2)參見手動重置事件例如[http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx][1]
可替代地,使用.NET 4,只是使用並行LINQ,容易!
IEnumerable<myDelegate> delegates;
delegates.AsParallel().ForEach(adelegate => adelegate());
完成!
編輯︰如果我錯過了你的後臺線程的目的是停止GUI鎖定,那麼我可能會啓動一個新的線程,一個接一個地執行任務,並只使用一個手動重置事件。當然,這取決於你的要求。