并行的foreach循环 – 奇怪的行为

下面的代码只是创建一个List> of random numbers,然后计算并行foreach循环中每个列表的累积和。 为什么我得到的数字少于’numLists’? 通常在9990左右。我猜它与线程安全有关。 什么是替代方法? (我是C#初学者,所以希望我使用正确的术语)谢谢。

using System; using System.Collections.Generic; using System.Threading.Tasks; namespace testParallelForeach { class Program { static void Main(string[] 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确实不是线程安全的,因此cumsupDataP.Add(...)以不可预测的方式丢弃数据。

将该行替换为:

 ConcurrentBag> cumsumDataP = new ConcurrentBag>(); 

这一切都会奏效。 请注意, ConcurrentBag无序的 ,但这很好,因为无论如何都无法预测线程的顺序; p