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

本文关键字:列表 无效 断点 ForEach Parallel 外设 设置 | 更新日期: 2023-09-27 18:17:12

我明白,当使用TPL并行。对于ach,我们不需要显式地编写代码来"等待"它内部的任务完成。然而,我正在做一个从源列表到目标列表的1000个元素的简单传输。设置一个断点OUTSIDE和AFTER并行。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;

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

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

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

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