2010-05-03 6 views
1

J'utilise C# .NET. C'est une application graphique. Lorsque l'utilisateur clique sur un bouton, le travail est affecté à 4 travailleurs d'arrière-plan différents. Chacun prend une quantité de temps différente et le résultat final est qu'ils remplissent certaines variables.Comment appeler une méthode lorsque tous les threads (backgroundWorkers) se font avec leur emploi dans .NET

Je dois appeler une méthode qui fonctionne sur ces résultats finaux de chaque bgwoeker et donne le résultat final. Comment accomplir cela?

problème ici est d'être sûr que tous les bgworkers sont faites avec leur travail.

Répondre

3

Vous pouvez créer un compteur et le vérifier à partir du gestionnaire d'événements RunWorkerCompleted de chaque BackgroundWorker ou vérifier l'état des trois autres fondeurs de RunWorkerCompleted de chaque arrière-plan.

0

Vous pouvez résumer cette fonctionnalité dans une classe:

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) Si vous êtes réellement effectuez un travail que vous vous attendez à remplir, ne pas utiliser un travailleur de fond, utilisez un fil approprié ou comme ci-dessus, l'utilisation le pool de threads.

2) Voir un exemple d'événement réarmement manuel [http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx][1]

alternative, l'utilisation .net 4 et il suffit d'utiliser LINQ parallèle, facile!

IEnumerable<myDelegate> delegates; 
delegates.AsParallel().ForEach(adelegate => adelegate()); 

Terminé! Edit: Si j'ai manqué le but de vos threads d'arrière-plan est d'arrêter le verrouillage de l'interface graphique, alors je voudrais probablement lancer un nouveau thread, exécuter les tâches les unes après les autres, et utiliser un seul événement de réinitialisation manuelle. Bien sûr, cela dépend vraiment de vos besoins.

Questions connexes