IEnumerable<T>
接口上有 AsParallel
方法,Partitioner
类上也提供了这个方法,使用这个类我们可以自定义分块的建立。
首先你可以在 System.Collections.Concurrent
命名空间中找到这个类,他提供了一个 Create
方法,第一个参数接受一个数组或者实现 IList<T>
的对象,第二个参数是个 Boolean
类型的参数。根据不同的传入参数,该方法返回一个特定分块类型的变量。(比如传入一个数组,返回 DynamicPartitionerForArray<Tsource>
或StaticPartitionerForArray<TSource>
,这些类型都继承自一个虚类OrderablePartitioner<TSource>
)
下面是实例的代码:
var result = (from x in Partitioner.Create(data, true).AsParallel()
where Math.Log(x) < 4 select x).Average();
你还可以通过调用 WithExecutionMode
/ WithDegreeOfParallelism
方法来定义其他的分块逻辑。
- WithExecutionMode
传入一个名为ParallelExecutionMode
参数(值为Default
或ForceParallelism
),Default
方式下能防止过度使用并行处理。
- WithDegreeOfParallelism
传入一个 integer 值来指定最大的并行任务数。