确定C#Partitioner.GetPartitions()

时间:2015-12-18 16:02:47

标签: c# asynchronous async-await task-parallel-library

以下是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)时应考虑哪些因素?

硬件是否有所不同(核心数,可用内存等)?

数据/操作的类型会影响计数吗?

我的第一个猜测是将dop设置为等于Environment.ProcessorCount的一般情况,但我的直觉告诉我可能不相关。

2 个答案:

答案 0 :(得分:1)

硬件和操作都很重要。

如果你想运行不受任何其他方式限制的CPU绑定工作,你根本不需要方法。您最好使用ParallelPLINQ为此而做的(并且在IO处非常糟糕)。

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

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

使用Environment.ProcessorCount对IO毫无意义。当你添加CPU时,IO不会变得更快。

答案 1 :(得分:0)

DOP的值会影响硬件。您可以给DOP任何可行的值。

您一次赋予大量并行代码处理的值。

例如,如果您的DataSet中有1000行,则需要处理每行并对其执行某些操作。现在,如果您的DOP值为50,那么一次将并行处理50行。