De la tâche.Usine.StartNew avec async lambda et de la Tâche.WaitAll

Je suis en train d'utiliser Task.WaitAll sur une liste de tâches. Le truc, c'est que les tâches sont un async lambda qui rompt Tasks.WaitAll comme il n'attend jamais.

Voici un exemple de bloc de code:

List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(async () =>
{
    using (dbContext = new DatabaseContext())
    {
        var records = await dbContext.Where(r => r.Id = 100).ToListAsync();
        //do long cpu process here...
    }
}
Task.WaitAll(tasks);
//do more stuff here  

Cela ne veut pas attendre, car le lambda asynchrone. Alors, comment suis-je censé attendre opérations d'e/S dans ma lambda?

  • Quel est le point de commencer une tâche sur un autre thread si la première chose que vous faites après que vous commencez, il est bloquer sur le Task.WaitAll appel? Vous obtiendrez de meilleures performances se débarrasser de ToListAsync et de le rendre juste ToList et en l'exécutant en mode synchrone. (ou si vous voulez utiliser ToListAsync ensuite, vous devez utiliser asynchrone tout en haut de votre pile d'appel.