C# async attendent à l'aide de LINQ ForEach()

J'ai le code suivant qui utilise correctement async/await paradigme.

internal static async Task AddReferencseData(ConfigurationDbContext context)
{
    foreach (var sinkName in RequiredSinkTypeList)
    {
        var sinkType = new SinkType() { Name = sinkName };
        context.SinkTypeCollection.Add(sinkType);
        await context.SaveChangesAsync().ConfigureAwait(false);
    }
}

Ce qui est l'équivalent de la façon d'écrire ce si, au lieu d'utiliser foreach(), je veux utiliser LINQ ForEach()? Celle-ci, par exemple, donne une erreur de compilation.

internal static async Task AddReferenceData(ConfigurationDbContext context)
{
    RequiredSinkTypeList.ForEach(
        sinkName =>
        {
            var sinkType = new SinkType() { Name = sinkName };
            context.SinkTypeCollection.Add(sinkType);
            await context.SaveChangesAsync().ConfigureAwait(false);
        });
}

Le seul code que j'ai eu à travailler sans erreur de compilation est ce.

internal static void AddReferenceData(ConfigurationDbContext context)
{
    RequiredSinkTypeList.ForEach(
        async sinkName =>
        {
            var sinkType = new SinkType() { Name = sinkName };
            context.SinkTypeCollection.Add(sinkType);
            await context.SaveChangesAsync().ConfigureAwait(false);
        });
}

Je suis inquiet que cette méthode n'a pas de async signature, seulement le corps ne.
Est-ce le bon équivalent de mon premier bloc de code ci-dessus?

  • ForEach pas une fonction de linq
  • Pourquoi voulez-vous changer? Si elle n'est pas cassé, ne le répare pas.
  • Excellent post d'Eric Lipert à l'aide de “foreach” vs “ForEach” blogs.msdn.com/b/ericlippert/archive/2009/05/18/...
  • Si j'allais faire quelque chose, je mettrais l' SaveChangesAsync en dehors de la boucle. Je doute qu'il n'y a aucun avantage à le mettre à l'intérieur (au contraire, il y a probablement une perte de performance).
  • Mager en effet - c'est presque toujours une mauvaise idée de mettre SaveChanges() dans une boucle. Sur l'autre remarque, pourquoi êtes-vous en invoquant la async version exactement?
InformationsquelleAutor SamDevx | 2015-05-15