我正在使用Parallel.For制作虚拟数据
List<Employee> emp = new List<Employee>();
Parallel.For(0, 100000, i => {
emp.Add(new Employee() { Id = i.ToString(), name = "EmployeeName "+ i });
});
Console.WriteLine("List Full");
return emp;
所以,在调试过程中,我观察到emp.Count的不同值 供参考,请参阅下文
为什么这样做 - 没有显示100000?
答案 0 :(得分:2)
它的行为方式是List不是线程安全的。两个并发运行的线程正在向列表中添加一个对象,有时会出现竞争条件并且只有一个线程成功,而另一个线程只认为它成功,或者如果事情变得非常糟糕,它可能会爆炸并抛出异常为了它。
使用其中一个Concurrent集合以并发安全的方式添加内容,例如:一个ConcurrentBag
我的博客上有一个例子: http://colinmackay.co.uk/2011/04/21/parallelisation-talk-example-concurrentbag/
请记住,因为您正在使用并发集合,并且有多个线程填充它,您无法控制序列,因此它是您将使用的ConcurrentBag
而不是List(列表是有序的)。如果序列很重要,那么你可以在最后使用Linq按照你想要的方式对它进行排序,你也可以使用ToList<T>
将它放入列表中,如果这也很重要。
我还写了一些关于并发性的文章,您可能也觉得有用:http://colinmackay.co.uk/tag/parallelisation/