在Parallel.ForEach之外设置断点的列表计数无效

时间:2014-08-09 19:08:38

标签: c# .net multithreading task-parallel-library parallel.foreach

据我所知,在使用TPL Parallel.ForEach时,我们不需要显式编写代码来“等待”其中的任务完成。但是,我正在将1000个元素从源列表简单地传输到目标列表。在设置断点OUTSIDE和在Parallel.ForEach循环之后,我看到目标列表中项目的无效/不完整计数...为什么?

List<int> myList = new List<int> { };
for (int i = 0; i < 1000; i++) {
    myList.Add(i);
}
List<int> newList = new List<int>();
Parallel.ForEach(myList, x => {
    newList.Add(x);
});
Thread.Sleep(5000);
var test = newList.Count;

1 个答案:

答案 0 :(得分:2)

List不是线程安全的,因此您无法在并行代码中使用它。您应该使用ConcurrentBag(或任何其他线程安全的集合):

var bag = new ConcurrentBag<int>();
Parallel.ForEach(myList, x =>
{
    bag.Add(x);
});

您还可以在lock周围使用newList,但这会使并行化无效。