Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这两种方法的行为是否相同?_C#_Task Parallel Library - Fatal编程技术网

C# 这两种方法的行为是否相同?

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 => {

以下两个代码并行处理列表中的项目,并行度阈值为5。它们实际上是一样的吗

Parallel.ForEach与MaxDegreeOfParallelism的并行性

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);
            });