Maison > développement back-end > C++ > Les opérations asynchrones peuvent-elles être utilisées avec ForEach et quelle est la meilleure alternative ?

Les opérations asynchrones peuvent-elles être utilisées avec ForEach et quelle est la meilleure alternative ?

Patricia Arquette
Libérer: 2025-01-05 18:41:40
original
436 Les gens l'ont consulté

Can Async Operations Be Used with ForEach, and What's the Best Alternative?

Utilisation d'Async dans ForEach

Question :

Est-il possible d'utiliser la fonctionnalité asynchrone dans le contexte de ForEach ? Un extrait de code illustrant la tentative d'implémentation est fourni ci-dessous :

using (DataContext db = new DataLayer.DataContext())
{
    db.Groups.ToList().ForEach(i => async {
        await GetAdminsFromGroup(i.Gid);
    });
}
Copier après la connexion

Cependant, lors de l'exécution, l'erreur suivante se produit :

The name 'Async' does not exist in the current context
Copier après la connexion

Notez que la méthode encapsulant l'instruction using a été désignée comme asynchrone.

Réponse :

La mise en œuvre de ForEach employé par List n'est pas intrinsèquement compatible avec la fonctionnalité asynchrone (similaire à LINQ-to-objects).

Pour ce scénario spécifique, il est conseillé d'adopter une approche alternative. Cela implique de projeter chaque élément dans une opération asynchrone. Par la suite, l'achèvement de ces opérations peut être attendu de manière asynchrone.

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

Cette approche offre plusieurs avantages par rapport à l'utilisation d'un délégué asynchrone avec ForEach :

  • Gestion améliorée des erreurs : Les exceptions provenant d'opérations void asynchrones ne peuvent pas être gérées avec catch. Alternativement, cette méthode propagera les exceptions à la ligne où Task.WhenAll est attendu, permettant ainsi des capacités naturelles de gestion des exceptions.
  • Visibilité de l'achèvement : La conclusion des tâches est facilement perceptible à la fin de cette méthode grâce à l’emploi de Task.WhenAll. En revanche, les opérations d'annulation asynchrone ne disposent pas d'un moyen simple de déterminer l'achèvement.
  • Syntaxe naturelle : Cette approche s'aligne sur la syntaxe naturelle pour récupérer les résultats. GetAdminsFromGroupAsync implique une opération qui produit un résultat (les administrateurs), ce qui rend ce code plus intuitif lorsque de telles opérations peuvent renvoyer leurs résultats plutôt que de s'appuyer sur des effets secondaires pour définir des valeurs.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal