以下是ForEachAsync
written by Stephen Toub的实现
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);
}));
}
指定partitionCount(在这种情况下为
dop
)时应考虑哪些因素?硬件是否有所不同(内核数量,可用的RAM等)?
数据/操作的类型会影响计数吗?
我的第一个猜测是在一般情况下将
dop
设置为等于Environment.ProcessorCount
,但是我的直觉告诉我,这可能无关紧要。 最佳答案
硬件以及执行的操作都非常重要。
如果您要运行不受任何其他方式限制的CPU限制的工作,则根本不需要方法。最好使用专门为此而设计的Parallel
或PLINQ
(并且在IO上非常糟糕)。
对于IO,没有简单的方法来预测最佳DOP。例如,诸如DOP 1的磁盘。诸如4-16(?)的SSD。 Web服务几乎可以具有任何价值。我可以继续列出更多因素,包括数据库,锁争用等。
您需要在测试环境中测试不同的数量。然后,使用效果最佳的值。
对于IO,使用Environment.ProcessorCount
没有任何意义。添加CPU时,IO不会变快。