【发布时间】:2018-06-06 17:15:41
【问题描述】:
在 C# 交互窗口中运行以下代码
using System.Collections.Concurrent;
var l = Enumerable.Range(0, 20);
Partitioner.Create(l).GetPartitions(4)
.Select(x => {
var s = "";
while (x.MoveNext()) { s += x.Current.ToString() + ","; };
return s;
})
返回
Enumerable.WhereSelectArrayIterator<IEnumerator<int>, string>
{ "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,", "", "", "" }
似乎一个分区获得了所有值?我尝试了大尺寸Enumerable.Range(0, 12000) 并且所有元素仍然在第一个分区中。
我想确保下面的扩展方法可以均匀地划分列表。
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition)
while (partition.MoveNext())
await body(partition.Current);
}));
}
【问题讨论】:
-
源码中有一条注释:例如,默认情况下,在IEnumerable实现的常见场景中,将采用某种形式的缓冲和分块来实现最佳性能快速且无阻塞。见github.com/Microsoft/referencesource/blob/master/mscorlib/…