2010-05-03 29 views
1

我正在使用C#.NET。它是一個GUI應用程序。當用戶點擊一個按鈕時,工作被分配給4個不同的後臺工作人員。每個人花費不同的時間,最終的結果是他們填充了一些變量。如何在.NET中完成所有線程(backgroundWorkers)的作業時調用方法

我需要調用一個方法,對每個bgwoeker的這些最終結果進行操作並給出最終輸出。如何做到這一點?

這裏的問題是要確保所有bg工人都完成了他們的工作。

回答

3

您可以製作計數器並從每個BackgroundWorker的RunWorkerCompleted eventhandler中檢查它,或從每個BackgroundWorker的RunWorkerCompleted中檢查其他3個Backgroundworkers的狀態。

0

您可以在一個類中封裝此功能:

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

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鎖定,那麼我可能會啓動一個新的線程,一個接一個地執行任務,並只使用一個手動重置事件。當然,這取決於你的要求。

相關問題