在 Java 中,我可以编写一个Spliterator
接口实现,在其中我可以指定源集合将如何精确地拆分为子集合以进行并行处理。
但我不明白如何在 C# 中执行此操作,我只知道您可以调用AsParallel
on IEnumerable
,但是您可以控制拆分过程吗?
例如,我的源集合是一个数组,我想将其拆分为 5 个项目子数组,并希望 linq 与这些子数组一起工作。这可能吗?
在 Java 中,我可以编写一个Spliterator
接口实现,在其中我可以指定源集合将如何精确地拆分为子集合以进行并行处理。
但我不明白如何在 C# 中执行此操作,我只知道您可以调用AsParallel
on IEnumerable
,但是您可以控制拆分过程吗?
例如,我的源集合是一个数组,我想将其拆分为 5 个项目子数组,并希望 linq 与这些子数组一起工作。这可能吗?
如果你有特定的分区要求,你应该看看Custom Partitioners for PLINQ and TPL和How to: Implement a Partitioner for Static Partitioning。这些给出了如何实现 a 的示例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));
目前 C# 不像 Java 那样提供这个特性。C# 中的并行任务有一个MaxDegreeOfParallelism参数,可让您指定 ParallelOptions 实例启用的最大并发任务数,并自动处理任务数。