incrémenter une valeur de comptage en dehors de la scope de parallel.foreach

Comment puis-je incrémenter une valeur entière en dehors de la scope d’une boucle parallel.foreach? Quel est le moyen le plus léger de synchroniser l’access aux objects en dehors des boucles parallèles?

var count = 0; Parallel.ForEach(collection, item => { action(item); // increment count?? } 

J’aime battre les chevaux morts! 🙂

Le moyen le plus “léger” d’incrémenter le nombre à partir de plusieurs threads est le suivant:

 Interlocked.Increment(ref count); 

Mais comme d’autres l’ont fait remarquer: si vous le faites dans Parallel.ForEach vous faites probablement quelque chose de mal.

Je soupçonne que, pour une raison quelconque, vous utilisez ForEach mais vous avez besoin d’un index pour l’élément que vous ForEach (cela ne fonctionnera jamais avec Parallel.ForEach ). Est-ce que je suis proche? Pourquoi avez-vous besoin du compte? Quelle sorte de magie VooDoo essayez-vous de faire?

METTRE À JOUR:

Vous semblez être en sécurité avec ConcurrentDictionary si votre clé est l’ URI et que la valeur est TAnswer . Je ne vois pas de problème tant que vous n’essayez pas d’utiliser le décompte pour référencer des éléments de votre collection.

Finalement…

Si vous avez besoin d’un compteur, utilisez la boucle Parallel.For … elle incrémentera le compteur en toute sécurité.

Utilisez Interlocked.Increment .

Je n’incrémenterais pas les choses dans un même sens (à moins que vous utilisiez Interlocked.Increment ou un autre mécanisme de locking). Ce n’est pas pour ça. Le foreach parallèle ne doit être exécuté qu’avec des actions ne causant aucun effet secondaire dans un état partagé. Incrémenter une valeur dans un foreach parallèle causera le problème que vous essayez probablement d’éviter.