boucle foreach parallèle – comportement étrange

Le code ci-dessous crée simplement une liste> de nombres aléatoires, puis calcule la sum cumulée de chaque liste dans une boucle foreach parallèle. Pourquoi ai-je moins d’évaluations que ‘numLists’? Souvent autour de 9990. Je suppose que cela a quelque chose à voir avec la sécurité du fil. Quelle est une méthode alternative? (Je suis un débutant en C #, alors j’espère que j’utilise les termes corrects) Merci.

using System; using System.Collections.Generic; using System.Threading.Tasks; namespace testParallelForeach { class Program { static void Main(ssortingng[] args) { List<List> bsData = new List<List>(); List<List> cumsumDataP = new List<List>(); int numLists = 10000; int myLen = 400; Random rand = new Random(); for (int i = 0; i < numLists; i++) { bsData.Add(new List()); for (int j = 0; j  cumsumDataP.Add(CumulativeSumParallel(a))); Console.WriteLine("cumsumDataP.Count={0}", cumsumDataP.Count); Console.ReadKey(); } public static List CumulativeSumParallel(List singleRetSeries) { int r = singleRetSeries.Count; List cumsumList = new List(); cumsumList.Add(singleRetSeries[0]); for (int i = 1; i < r; i++) { cumsumList.Add(cumsumList[i - 1] + singleRetSeries[i]); } return cumsumList; } } } 

List n’est en effet pas thread-safe, donc cumsupDataP.Add(...) supprime des données de manière imprévisible.

Remplacez cette ligne par:

 ConcurrentBag> cumsumDataP = new ConcurrentBag>(); 

et tout fonctionnera. Notez que ConcurrentBag n’est pas ordonné , mais c’est acceptable car vous n’avez aucun moyen de prédire l’ordre à partir des threads de toute façon;