对于并行循环任务

时间:2013-12-04 09:27:19

标签: c# task-parallel-library

我正在使用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的不同值 供参考,请参阅下文

First time

enter image description here

为什么这样做 - 没有显示100000?

1 个答案:

答案 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/