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

C# 使用PLINQ,在使用AsParallel()时,如何设置首选块大小。MaxDegreeOfParallelism(4)?,c#,.net,linq,plinq,parallel-processing,C#,.net,Linq,Plinq,Parallel Processing,我有一个包含数千个对象的列表,其中执行的操作可能需要1到3分钟。 我当然在使用PLINQ,但我注意到,当接近输入列表的末尾时,只有一个内核在工作,就像预先确定了分区一样 那么,对于IList,只要有要处理的项,强制PLINQ继续使用工作线程的最佳方法是什么? 这台计算机有很多可用的硬件核心 参考资料: 据我所知,PLINQ将根据源序列是否为IList选择范围分区或块分区。如果它是一个IList,那么边界是已知的,元素可以通过索引访问,因此PLINQ选择范围分区来在线程之间平均划分列表。例

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

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

参考资料:


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

在您的情况下,如果您有一个
IList
,并且您想要强制执行块分区,那么您可以将其设置为一个简单的
IEnumerable
:而不是编写以下内容:

list.AsParallel()...
写下:

list.Select(x => x).AsParallel()...
虚拟投影将隐藏源实际上是一个
IList
,因此PLINQ将使用块分区