2010-06-15 13 views
1

Je suis encore relativement nouveau en informatique parallèle, donc je ne sais pas trop quel outil utiliser pour le travail.Que faire pour attendre un nombre indéterminé de tâches?

J'ai un System.Threading.Tasks.Task qui doit attendre la fin du nombre n de tâches avant de commencer. La partie délicate est que certaines de ses dépendances peuvent commencer après le démarrage de cette tâche (vous êtes assuré de ne jamais toucher les 0 tâches dépendantes jusqu'à ce qu'elles soient toutes terminées).

Voici le genre de ce qui se passe

  1. thread parent crée quelque part entre 1 et (NUMBER_OF_CPU_CORES - 1) tâches.
  2. Le thread parent crée une tâche à exécuter lorsque toutes les tâches du travail sont terminées.
  3. Le thread parent crée un thread de surveillance
  4. Le thread de surveillance peut supprimer une tâche de travail ou générer une nouvelle tâche en fonction de la charge.

Je peux comprendre tout à l'étape 4. Comment puis-je obtenir la tâche de l'étape 2 à attendre pour courir jusqu'à ce que tous les nouveaux threads de travail créé à l'étape 4 finition?

+0

Conservez-vous une liste ou un compte des tâches en cours? – tzaman

+0

Les tâches actuellement actives seront dans une liste

Répondre

1

Vous pouvez passer un tableau des Task s que vous attendez à TaskFactory.ContinueWhenAll, ainsi que la nouvelle tâche à démarrer une fois tous les travaux terminés.

modifier: Solution de contournement possible pour votre problème de tâches générées dynamiquement: avoir une continuation en deux étapes; Chaque "tâche dépendante" que vous démarrez doit avoir un ContinueWith chaîné qui vérifie le nombre total de tâches en cours d'exécution et, s'il est nul, lance la tâche de continuation réelle. De cette façon, chaque tâche fera le contrôle quand c'est fait, mais seulement le dernier lancera la phase suivante. Vous devrez bien sûr synchroniser l'accès au compteur "tâches restantes".

+0

Le tableau ContunueWhenAll est-il capturé au moment du bloc ou peut-il être ajouté au tableau après l'appel? –

+0

Hmm, question intéressante. En fait, je suis à peu près sûr qu'il est gelé au moment de l'appel, donc ce n'est peut-être pas approprié à votre situation. – tzaman