以下是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限制的工作,则根本不需要方法。最好使用专门为此而设计的ParallelPLINQ(并且在IO上非常糟糕)。

对于IO,没有简单的方法来预测最佳DOP。例如,诸如DOP 1的磁盘。诸如4-16(?)的SSD。 Web服务几乎可以具有任何价值。我可以继续列出更多因素,包括数据库,锁争用等。

您需要在测试环境中测试不同的数量。然后,使用效果最佳的值。

对于IO,使用Environment.ProcessorCount没有任何意义。添加CPU时,IO不会变快。

08-16 01:38