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
Libérer: 2025-02-01 03:26:09
original
565 Les gens l'ont consulté

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:

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
Copier après la connexion

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:

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;
Copier après la connexion

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:

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;
Copier après la connexion

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 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