我正在尝试用一百万个独立生成的项目填充列表。但是在循环之后,我得到的条目变少了: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
语句。