Maison > développement back-end > C++ > Comment puis-je utiliser correctement les fonctions Lambda asynchrones avec parallèle.

Comment puis-je utiliser correctement les fonctions Lambda asynchrones avec parallèle.

Barbara Streisand
Libérer: 2025-02-01 03:31:08
original
989 Les gens l'ont consulté

How Can I Properly Use Asynchronous Lambda Functions with Parallel.ForEach?

Traitement parallèle avec des fonctions de lambda asynchrones

La combinaison du traitement parallèle et des fonctions LAMBDA asynchrones nécessite une attention particulière. Cet article relève des défis de l'utilisation des méthodes async dans Parallel.ForEach et propose des solutions efficaces.

Le problème avec parallèle.ForEach et Async Lambdas

Parallel.ForEach lance des threads d'arrière-plan qui n'attendent pas intrinsèquement l'achèvement des tâches. Cela crée des problèmes lors de l'utilisation de await à l'intérieur de l'expression de lambda. L'exemple suivant illustre ce problème:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // some pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // some post-processing
});
var count = bag.Count; // count will be 0</code>
Copier après la connexion

le count sera 0 car le thread principal continue l'exécution avant que les threads d'arrière-plan terminent leurs opérations asynchrones. L'utilisation de Wait() comme solution de contournement, comme indiqué ci-dessous, annule les avantages de await et nécessite une manipulation explicite des exceptions:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // some pre-processing
  var responseTask = GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // some post-processing
});
var count = bag.Count;</code>
Copier après la connexion

Solution utilisant la tâche. Une solution plus efficace consiste à tirer parti de

pour gérer les opérations asynchrones:

Task.WhenAll

Cette approche permet à chaque élément d'être traité de manière asynchrone, et
<code class="language-csharp">var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
  // some pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // some post-processing
});
await Task.WhenAll(tasks);
var count = bag.Count; // count will be correct</code>
Copier après la connexion
garantit que toutes les tâches se terminent avant de continuer.

Task.WhenAll

Solution avancée: foreachasync

Pour un traitement parallèle asynchrone plus sophistiqué, explorez le blog de Stephen Toub sur

. Cela fournit une solution robuste et flexible pour gérer les scénarios complexes.

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