Maison >développement back-end >C++ >Comment gérer correctement les opérations asynchrones dans une boucle ForEach C# ?

Comment gérer correctement les opérations asynchrones dans une boucle ForEach C# ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-05 09:38:12413parcourir

How to Properly Handle Asynchronous Operations within a C# ForEach Loop?

Interrogation de données avec Async et ForEach

Lorsque vous travaillez avec des opérations asynchrones en C#, il est essentiel de comprendre comment les intégrer correctement au code des blocs comme ForEach. Un défi courant survient lorsque l'on tente d'utiliser le mot-clé Async dans une instruction ForEach, ce qui peut entraîner des erreurs de compilation.

Erreur : Async n'existe pas dans le contexte actuel

Comme démontré dans l'extrait de code ci-dessous, tenter d'utiliser Async dans une instruction ForEach peut entraîner l'erreur error :

using (DataContext db = new DataLayer.DataContext())
{
    db.Groups.ToList().ForEach(i => async {
        await GetAdminsFromGroup(i.Gid);
    });
}

L'erreur se produit car le nom 'Async' n'existe pas dans le contexte actuel. En effet, ForEach ne prend pas en charge les délégués asynchrones.

Approche alternative utilisant Task.WhenAll

Pour gérer efficacement les opérations asynchrones dans une instruction ForEach, on peut utiliser la tâche. Méthode WhenAll. Cette approche consiste à projeter chaque élément dans une opération asynchrone :

using (DataContext db = new DataLayer.DataContext())
{
    var tasks = db.Groups.ToList().Select(i => GetAdminsFromGroupAsync(i.Gid));
    var results = await Task.WhenAll(tasks);
}

Cette approche offre plusieurs avantages :

  • Gestion appropriée des erreurs : Les méthodes void asynchrones ne peuvent pas être pris avec prise. Task.WhenAll permet une gestion naturelle des exceptions.
  • Conscience de l'achèvement : En utilisant Task.WhenAll, on peut déterminer quand toutes les opérations asynchrones sont terminées.
  • Naturel syntaxe pour récupérer les résultats : GetAdminsFromGroupAsync implique une opération qui produit un résultat, qui peut être naturellement renvoyé plutôt que défini comme côté effet.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn