C# 这两种方法的行为是否相同?
以下两个代码并行处理列表中的项目,并行度阈值为5。它们实际上是一样的吗 Parallel.ForEach与MaxDegreeOfParallelism的并行性C# 这两种方法的行为是否相同?,c#,task-parallel-library,C#,Task Parallel Library,以下两个代码并行处理列表中的项目,并行度阈值为5。它们实际上是一样的吗 Parallel.ForEach与MaxDegreeOfParallelism的并行性 public async Task Run() { var list = // List<....> Parallel.ForEach(list, new ParallelOptions { MaxDegreeOfParallelism = 5}, d => {
public async Task Run()
{
var list = // List<....>
Parallel.ForEach(list,
new ParallelOptions { MaxDegreeOfParallelism = 5}, d => {
....
process(d).RunSynchronously();
....
});
}
Parallel.Foreach
使用默认的分区器。如果您有一个小作业要执行,那么这可能是开销,因为每个分区都将被计算,并且每个分区都是一个委托,将在每次迭代中被调用
这种开销可以通过使用分区来修复。它使您能够为委托主体提供一个顺序循环,这样每个分区只调用一次委托,而不是每次迭代调用一次。还可以使用分区器控制分区
Parallel.ForEach(Partitioner.Create(0L, SUMTOP), (range) =>
{
long local = 0;
for (long i = range.Item1; i < range.Item2; i++) local += i;
Interlocked.Add(ref sum, local);
});
Parallel.ForEach(Partitioner.Create(0L,SUMTOP),(范围)=>
{
长局部=0;
对于(长i=range.Item1;i
第二个实现完成了类似的工作,但是是异步的,并且您有更多关于分区的命令。它将处理小作业的开销。
希望这个解释能帮助你做出选择 第一个向Parallel.Foreach发送一个异步delgate,这将导致一个未等待的异步void
Parallel.Foreach
不适用于异步操作,而仅适用于CPU绑定的代码。我已经更新了问题,并同步调用了异步方法来处理第一个问题。五个向下投票者,为什么?第一个实现中的MaxDegreeOfParallelism
会控制分区吗?不确定答案的第一段,列表中可能有一到数百项。小作业
指的是每次迭代中会发生的工作量。不管你有多少次迭代。如果工作负载很小,则可能会运行得比并行更快。
Parallel.ForEach(Partitioner.Create(0L, SUMTOP), (range) =>
{
long local = 0;
for (long i = range.Item1; i < range.Item2; i++) local += i;
Interlocked.Add(ref sum, local);
});