L'exécution des tâches en parallèle

Ok, donc en gros j'ai un tas de tâches (10) et je veux commencer en même temps et attendre pour eux de complet. Lorsque terminé, je veux exécuter d'autres tâches. J'ai lu un tas de ressources à ce sujet, mais je ne peux pas le faire juste pour mon cas particulier...

Voici ce que j'ai actuellement (code a été simplifié):

public async Task RunTasks()
{
    var tasks = new List<Task>
    {
        new Task(async () => await DoWork()),
        //and so on with the other 9 similar tasks
    }


    Parallel.ForEach(tasks, task =>
    {
        task.Start();
    });

    Task.WhenAll(tasks).ContinueWith(done =>
    {
        //Run the other tasks
    });
}

//This function perform some I/O operations
public async Task DoWork()
{
    var results = await GetDataFromDatabaseAsync();
    foreach (var result in results)
    {
        await ReadFromNetwork(result.Url);
    }
}

Donc mon problème est que lorsque je suis en attente de l'achèvement des tâches avec le WhenAll appel, il me dit que toutes les tâches sont plus de même si aucun d'entre eux sont terminés. J'ai essayé d'ajouter Console.WriteLine dans mon foreach et quand je suis entré dans la poursuite de la tâche, des données de conserve de venir dans mon précédent Tasks qui ne sont pas vraiment fini.

Ce que je fais mal?

Je soupçonne que dans tout ce que vous avez un Task<Task> quelque part (l'appel de la Tâche constructeur directement est un peu suspect) et vous voulez vraiment vous attendent à l'intérieur de la tâche. Pouvez-vous utiliser Task.Run au lieu de la Tâche constructeur/Commencer? Task.Run va faire le déballage pour vous.
Donc vous pensez que je devrais faire: var tâches = new List<Tâche> { Tâche.Exécuter(()=> DoWork()) }

OriginalL'auteur Yann Thibodeau | 2015-12-19