Если у вас есть особые требования к разделению, вам следует взглянуть на Пользовательские разделители для PLINQ и TPL и Как: реализовать разделитель для статического разбиения .Они приводят пример того, как вы можете реализовать Partitioner<TSource>
, который предположительно похож на Java Spliterator
.
Однако, в большинстве случаев более полезно позволить инфраструктуревыбрать свою собственную стратегию динамического разделения.Если вы хотите ограничить уровень параллелизма до 5, вы можете использовать WithDegreeOfParallelism
:
var summary = ints
.AsParallel()
.WithDegreeOfParallelism(5)
.Aggregate(
seed: (
count: 0,
sum: 0,
min: int.MaxValue,
max: int.MinValue),
updateAccumulatorFunc: (acc, x) => (
count: acc.count + 1,
sum: acc.sum + x,
min: Math.Min(acc.min, x),
max: Math.Max(acc.max, x)),
combineAccumulatorsFunc: (acc1, acc2) => (
count: acc1.count + acc2.count,
sum: acc1.sum + acc2.sum,
min: Math.Min(acc1.min, acc2.min),
max: Math.Max(acc1.max, acc2.max)),
resultSelector: acc => (
acc.count,
acc.sum,
acc.min,
acc.max,
avg: (double)acc.sum / acc.count));