如果您的 IEnumerable 确实具有索引器(即您可以obj[1]
将项目取出),您可以执行以下操作
var rangePartitioner = Partitioner.Create(0, source.Length);
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
// Loop over each range element without a delegate invocation.
for (int i = range.Item1; i < range.Item2; i++)
{
var item = source[i]
//Do work on item
}
});
但是,如果它不能这样做,您必须通过创建一个派生自System.Collections.Concurrent.Partitioner<TSource>
. 该主题过于广泛,无法在 SO 答案中涵盖,但您可以查看MSDN 上的本指南以帮助您入门。
更新:从 .NET 4.5 开始,他们添加了一个Partitioner.Create
不缓冲数据的重载,它与创建一个范围最大大小为 1 的自定义分区器具有相同的效果。这样你就不会得到一个拥有一堆如果连续一堆慢项目不走运,则排队工作。
var partitoner = Partitioner.Create(source, EnumerablePartitionerOptions.NoBuffering);
Parallel.ForEach(partitoner, item =>
{
//Do work
}