2010-04-19 3 views
2

Nous avons une analyse de rentabilisation qui serait parfaite pour plusieurs BackgroundWorkers. Par exemple, nous avons un formulaire avec un bouton "Enregistrer" dessus. Normalement, nous exécuterons toutes les commandes de sauvegarde (Save est un exemple) de manière synchrone, puis fermez le formulaire. Nous aimerions maintenant diviser le travail sur des threads séparés en utilisant backgroundworker.Spawning BackgroundWorkers

Nous ferons une boucle à travers chaque "Enregistrer" nécessaire (pourrait être beaucoup et/ou un nombre différent de commandes qui doivent être exécutées) créant un BackgroundWorker pour chaque commande requise.

La question est de savoir comment nous attendons que TOUS les BackgroundWorkers se terminent avant de fermer le formulaire. Nous comprenons comment attendre qu'un seul BackgroundWorker se termine mais quand nous avons X nombre de BackgroundWorkers en fonctionnement, comment pouvons-nous attendre que tout soit terminé avant de fermer le formulaire d'interface utilisateur?

Répondre

2

Suivre le nombre de BackgroundWorkers que vous avez commencé, décrémenter le numéro en cas Completed et fermez le formulaire lorsqu'il atteint 0.

Depuis l'événement Completed est élevé sur le thread d'interface utilisateur, vous n » Vous devez vous soucier de la sécurité des threads.

+0

c'est une bonne idée! – washtik

0

Je vous recommande d'utiliser la classe CountDownLatch présentée ci-après (excellent) article MSDN Magazine:

9 Reusable Parallel Data Structures and Algorithms

Compte SLaks esprit noter à propos BackgroundWorker Completed événements soulevées sur le thread d'interface utilisateur, ce pourrait être exagéré.

+0

Vous n'avez pas besoin de. BackgroundWorker déclenche son événement 'Completed' sur le thread de l'interface utilisateur, donc la sécurité des threads n'est pas un problème. – SLaks

+0

Je n'ai jamais utilisé BackgroundWorker auparavant, j'ai donc appris quelque chose aujourd'hui. Cela signifie-t-il qu'ils ne peuvent être utilisés que dans une application Forms? – spender

+0

Non; il utilise 'SynchronizationContext'. – SLaks

Questions connexes