据我所知,在使用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;
答案 0 :(得分:2)
List
不是线程安全的,因此您无法在并行代码中使用它。您应该使用ConcurrentBag
(或任何其他线程安全的集合):
var bag = new ConcurrentBag<int>();
Parallel.ForEach(myList, x =>
{
bag.Add(x);
});
您还可以在lock
周围使用newList
,但这会使并行化无效。