使用PLINQ时,如何在使用AsParallel()时设置首选块大小.MaxDegreeOfParallelism(4)?

时间:2011-10-30 21:49:12

标签: c# .net linq plinq parallel-processing

我有一个包含数千个对象的列表,可以执行1到3分钟的操作。 我当然正在使用PLINQ,但我注意到,当接近输入列表的末尾时,只有一个核心正在工作,就像事先确定了分区一样。

因此,对于IList,只要有待处理的项目,强制PLINQ继续使用工作线程的最佳方法是什么? 计算机有很多硬件核心可用。

参考文献:

1 个答案:

答案 0 :(得分:2)

根据我的理解,PLINQ将根据源序列是否为IList来选择范围或块分区。如果它是IList,则边界是已知的,并且元素可以通过索引访问,因此PLINQ选择范围分区以在线程之间均匀地划分列表。例如,如果列表中有1000个项目并且使用4个线程,则每个线程将有250个要处理的项目。另一方面,如果源序列 IList,则PLINQ不能使用范围分区,因为它不知道范围是什么;所以它使用块分区。

在你的情况下,如果你有一个IList而你想强制进行块分区,你可以让它看起来像一个简单的IEnumerable:而不是写这个:

list.AsParallel()...

写下:

list.Select(x => x).AsParallel()...

虚拟投影将隐藏源实际上是IList的事实,因此PLINQ将使用块分区。