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>
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>
Solution utilisant la tâche. Une solution plus efficace consiste à tirer parti de
pour gérer les opérations asynchrones:
Task.WhenAll
<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>
Task.WhenAll
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!