以并行方式填充List中的项数不正确.For循环



我正在尝试用一百万个独立生成的项目填充列表。但是在循环之后,我得到的条目变少了:999960,998534等等。

作为一个旁路,我将这段代码包装在另一个检查生成数量并生成缺失项的代码中。

我也试过在循环后睡觉,但它并没有给出更接近期望的结果。

var someList = new List<ListItem>();
Parallel.For(0, 1000000, _ =>
{
var item = new ListItem();
//some logic here
someList.Add(item);
});
System.Console.WriteLine(someList.Count()); // returns less than 1000000

这种行为的原因是什么?解决这个问题的正确方法是什么?

如果您知道将生成多少项,只需使用数组:

var someList = new ListItem[1000000];
Parallel.For(0, someList.Length, i =>
{
var item = new ListItem();
//some logic here
someList[i] = item;
});

List<T>不是线程安全的。你可以用ConcurrentBag<T>,虽然那是ICollection<T>,而不是IList<T>。如果你需要后者,那么你将不得不同步多个线程,可能使用lock语句。

相关内容

  • 没有找到相关文章

最新更新