我有一个包含数千个对象的列表,可以执行1到3分钟的操作。 我当然正在使用PLINQ,但我注意到,当接近输入列表的末尾时,只有一个核心正在工作,就像事先确定了分区一样。
因此,对于IList,只要有待处理的项目,强制PLINQ继续使用工作线程的最佳方法是什么? 计算机有很多硬件核心可用。
参考文献:
答案 0 :(得分:2)
根据我的理解,PLINQ将根据源序列是否为IList
来选择范围或块分区。如果它是IList
,则边界是已知的,并且元素可以通过索引访问,因此PLINQ选择范围分区以在线程之间均匀地划分列表。例如,如果列表中有1000个项目并且使用4个线程,则每个线程将有250个要处理的项目。另一方面,如果源序列不 IList
,则PLINQ不能使用范围分区,因为它不知道范围是什么;所以它使用块分区。
在你的情况下,如果你有一个IList
而你想强制进行块分区,你可以让它看起来像一个简单的IEnumerable
:而不是写这个:
list.AsParallel()...
写下:
list.Select(x => x).AsParallel()...
虚拟投影将隐藏源实际上是IList
的事实,因此PLINQ将使用块分区。