Question

J'ai un code simple dans lequel le thread principal crée une nouvelle tâche. La tâche à son tour engendre de multiples tâches enfants. La principale discussion fait un « attente » sur la tâche parent. J'observant que je ne reçois pas la même sortie sur plusieurs pistes du programme. Dans le code ci-dessous je l'impression de la valeur de la variable d'itération dans chaque tâche, mais à travers différentes ne fonctionne que sous-ensembles seront imprimés sur. Je comprends que l'exécution n'est pas commandé mais il devrait encore être complet que je me attends à 100 chiffres pour obtenir imprimés (sans ordre particulier). N'appelle Attendre ne pas attendre pour toutes les tâches de l'enfant à remplir? Je suis en cours d'exécution Team System VS2010 Beta1

 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());
    }
Était-ce utile?

La solution

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

Ici, les principales attentes sur le parent, mais étant donné que les enfants de parents ont bien été créés comme détaché, qui fait pas make principal attendre implicitement sur les enfants, donc principal (et donc tout le processus) peut et souvent fin avant une tâche de l'enfant a eu la chance de courir.

Autres conseils

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

 Task.Factory.StartNew(() => 
            {
               Write(localInt);
            }, TaskCreationOptions.DetachedFromParent);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top