Maison >développement back-end >C++ >Le parallèle peut-il utiliser efficacement les expressions de lambda asynchrones?

Le parallèle peut-il utiliser efficacement les expressions de lambda asynchrones?

Linda Hamilton
Linda Hamiltonoriginal
2025-02-01 03:26:09566parcourir

Can Parallel.ForEach Effectively Utilize Asynchronous Lambda Expressions?

Parallélisme et Lambdas asynchrones: un acte d'équilibrage

Le traitement parallèle augmente considérablement les performances en distribuant des charges de travail sur plusieurs cœurs. Cependant, l'intégration des expressions de lambda asynchrones dans des boucles parallèles présente des défis uniques.

Le problème: tâches perdues

Considérez cet exemple:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // Pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // Post-processing
});
var count = bag.Count; // count is often 0</code>

Le count reste fréquemment 0 car les threads d'arrière-plan de Parallel.ForEach n'attendent pas que les opérations asynchrones se terminent. Une tentative naïve de résoudre ce problème:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // Pre-processing
  var responseTask = GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // Post-processing
});
var count = bag.Count;</code>

Bien que cela garantit l'achèvement de la tâche, il annule les avantages de la programmation asynchrone en bloquant les threads et en exigeant une manipulation manuelle des exceptions.

Solutions efficaces

pour un traitement parallèle simple avec des lambdas asynchrones:

<code class="language-csharp">var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
  // Pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // Post-processing
});
await Task.WhenAll(tasks);
var count = bag.Count;</code>

Cette approche crée une tâche pour chaque élément, permettant une exécution asynchrone. Task.WhenAll s'assure que toutes les tâches se terminent avant de continuer.

Pour des scénarios plus complexes, le blog de Stephen Toub sur ForEachAsync offre des techniques avancées et des meilleures pratiques. Cela fournit une solution plus robuste et efficace pour gérer les opérations asynchrones dans des boucles parallèles.

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