2009-06-14 7 views
1

J'ai un code simple dans lequel le thread principal crée une nouvelle tâche. La tâche génère à son tour plusieurs tâches enfants. Le thread principal fait un 'wait' sur la tâche parente. J'observe que je n'obtiens pas la même sortie à travers plusieurs exécutions du programme. Dans le code ci-dessous, j'imprime la valeur de la variable d'itération dans chaque tâche, mais à travers différentes exécutions, seuls les sous-ensembles sont imprimés. Je comprends que l'exécution n'est pas ordonnée mais il faudrait quand même qu'elle soit complète dans la mesure où je m'attends à ce que 100 numéros soient imprimés (sans ordre particulier). Est-ce que l'appel de Wait n'attend pas que toutes les tâches enfants soient terminées? Je suis en cours d'exécution VS2010 système Team Beta1Résultats incohérents lors de l'exécution et de la génération de tâches enfant

static void Main(string[] args) 
    { 
     Console.WriteLine("Main executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString()); 

     var task = Task.Factory.StartNew(WriteNumbers); 
     task.Wait(); 

    } 

    private static void WriteNumbers() 
    { 
     Console.WriteLine("WriteNumbers executing on ThreadID:- " + Thread.CurrentThread.ManagedThreadId.ToString()); 
     for (int i = 0; i < 100; i++) 
     { 
      int localInt = i; 
      Task.Factory.StartNew(() => 
       { 
        Write(localInt); 
       }, TaskCreationOptions.DetachedFromParent); 
     } 
    } 

    private static void Write(int i) 
    {    
     Console.WriteLine("Worker Thread executing on ThreadID:-" + Thread.CurrentThread.ManagedThreadId.ToString() + " Value:" + i.ToString()); 
    } 
+0

sonne comme un problème de concurrence – Kareem

Répondre

4

Par MSDN, vous avez besoin de plus d'attente ou d'une autre synchronisation, et je cite: « » » Lorsque vous attendez une tâche, vous attendez implicitement sur tous les enfants de cette tâche, sauf si ces enfants ont été créés en utilisant l'option DetachedFromParent.Tous les enfants détachés doivent être attendus séparément "" "

Ici, le principal attend sur parent, mais puisque les enfants des parents ont été créés comme détachés, cela fait pas make principal implicitement attendre les enfants aussi, si principaux (et par conséquent tout le processus) peuvent et souvent se terminer avant qu'une tâche d'enfant ait eu une chance de courir.

+0

Eh oui, je me suis rendu mes erreur quelques secondes après que j'ai posté (duh) –

2

Mon erreur: J'utilisé accidentellement l'option DetachedFromParent lors de la création des enfants

Task.Factory.StartNew(() => 
      { 
       Write(localInt); 
      }, TaskCreationOptions.DetachedFromParent); 
+0

droit, c'est ce que je l'ai expliqué dans ma réponse ci-dessus (juste avant que vous posté cette "réponse de soi"). Je ne pouvais pas, bien sûr, savoir que c'était une erreur - il serait naturel de vouloir (laisser tous les petits-enfants libres et avoir une seule attente dans l'ensemble), c'est apparemment pas réalisable dans la bibliothèque Parallèle des Tâches comme il se trouve aujourd'hui. –

+0

Pas de soucis ... Je pense que le paradigme que vous avez mentionné a beaucoup de sens, d'une certaine manière vous abandonnez la propriété de vos enfants, alors il vous suffit de "suivre" ces tâches et de les remplir si vous êtes en fonction des résultats de ces tâches pour tout calcul –

+0

PS - J'ai marqué votre solution comme la réponse depuis que vous l'avez posté juste avant que je réalise mon bousiller –

Questions connexes