L'Utilisation De La Tâche.WaitAll() pour gérer attendu tâches?

Idéalement ce que je veux faire est de retarder une tâche avec un non-mode de blocage, puis attendez que toutes les tâches à effectuer. J'ai essayé d'ajouter la tâche de l'objet retourné par la Tâche.Retard et ensuite utiliser Tâche.WaitAll mais il semble que cela ne va pas aider. Comment dois-je résoudre ce problème?

class Program
{
    public static async void Foo(int num)
    {
        Console.WriteLine("Thread {0} - Start {1}", Thread.CurrentThread.ManagedThreadId, num);

        var newTask = Task.Delay(1000);
        TaskList.Add(newTask);
        await newTask;

        Console.WriteLine("Thread {0} - End {1}", Thread.CurrentThread.ManagedThreadId, num);
    }

    public static List<Task> TaskList = new List<Task>();

    public static void Main(string[] args)
    {
        for (int i = 0; i < 3; i++)
        {
            int idx = i;
            TaskList.Add(Task.Factory.StartNew(() => Foo(idx)));
        }

        Task.WaitAll(TaskList.ToArray());
    }
}
  • Pourquoi faites-vous cela dans une Application Console? Il n'y a pas de contexte (par défaut), donc await a tendance à se comporter étrangement, de toute façon...
  • Quels sont exactement vous attendent à voir dans la console? Comment est-ce différent de ce que vous voyez?
  • Ce que j'attends de voir sont six lignes montrant à la fois Début et de Fin de chaque tâche. Mais pour l'instant, j'en vois seulement de Commencer...
  • Votre code semble fonctionner pour moi ... (s'exécutant dans un wpf solution, mais encore, le code fonctionne, une fois que la fin s'exécute sur le thread GUI...)
  • async void méthode que vous passez à Task.Factory.StartNew est une mauvaise idée. Vous ne pouvez pas garder une trace de la tâche en attente, il commence ou attraper toutes les exceptions qu'il peut jeter après await. Cochez cette pour plus d'info: stackoverflow.com/q/19747910/1768303
InformationsquelleAutor derekhh | 2013-11-08