有人可以解释这里发生的Parallel.ForEach循环逻辑吗?

时间:2018-11-28 19:43:35

标签: c# multithreading parallel.foreach

我只是想学习执行线程/任务的不同方法,我想要一种动态更改正在完成的任务的方法,并指出了Parallel.ForEach循环。我做了一个小例子程序,我有几个问题。

public void StartTest()
{
    List<Action> actions = new List<Action>();
    for (int i = 0; i < 6; i++)     
    {
        actions.Add(() => Function1("Word: " + i));
    }
    Parallel.ForEach(actions, new ParallelOptions
    {
        MaxDegreeOfParallelism = 2
    }, action => action());

    Console.WriteLine("Finished. \nTime Taken: " + total.ToString(@"dd\.hh\:mm\:ss"));
    Console.Read();
}


private void Function1(string word)
{
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine(word + " |  Task Id: " + Task.CurrentId + " |   " + i);
    }
    Console.WriteLine(word + " ----- Completed.");
}

所以我的第一个问题是循环的“ action => action()”块是做什么的?我知道lambda是什么,但实际上我只是不遵循。

我的第二个问题是为什么这是输出?

字:6 |任务ID:3 | 0

字:6 |任务ID:3 | 1

字:6 |任务ID:3 | 2

字:6 |任务ID:3 | 3

字:6 |任务ID:3 | 4

字:6 -----已完成。

字:6 |任务ID:3 | 0

字:6 |任务ID:3 | 1

字:6 |任务ID:3 | 2

字:6 |任务ID:3 | 3

字:6 |任务ID:3 | 4

字:6 -----已完成。

字:6 |任务ID:3 | 0

字:6 |任务ID:3 | 1

字:6 |任务ID:3 | 2

字:6 |任务ID:3 | 3

字:6 |任务ID:3 | 4

字:6 -----已完成。

字:6 |任务ID:3 | 0

字:6 |任务ID:3 | 1

字:6 |任务ID:3 | 2

字:6 |任务ID:3 | 3

字:6 |任务ID:3 | 4

字:6 -----已完成。

字:6 |任务ID:3 | 0

字:6 |任务ID:3 | 1

字:6 |任务ID:3 | 2

字:6 |任务ID:2 | 0

字:6 |任务ID:2 | 1

字:6 |任务ID:2 | 2

字:6 |任务ID:2 | 3

字:6 |任务ID:2 | 4

字:6 -----已完成。

字:6 |任务ID:3 | 3

字:6 |任务ID:3 | 4

字:6 -----已完成。

完成。

花费时间:00.00:00:00

为什么每个数字都是6?我了解线程的工作方式,但不了解参数的传递/引用。

这就是我的两个问题。任何帮助都将是极好的。我在Google搜索了一段时间,找不到适合我的任何文档。

2 个答案:

答案 0 :(得分:2)

关于第一个问题:

  

循环的“ action => action()”块做什么?

这就是actions列表中每个项目的名称。

更正式地说,它称为Paraller.ForEach的主体,并且是每次迭代调用一次的委托。有关更多信息,请查看here

关于第二个问题:

首先,应在i语句块内使用另一个变量来捕获变量for,然后再在创建的lambda中使用它,如下所示:

for (int i = 0; i < 6; i++)     
{
    var j = i; 
    actions.Add(() => Function1("Word: " + j));
}

您可以找到详细的解释,为什么要这样做here

答案 1 :(得分:2)

library(Rfast)
loglik <-function(parm){  
  A<-parm[1];B<-parm[2]
  -sum( Lgamma(A+B) - Lgamma(A)- Lgamma(B) + Lgamma(Y+A) + Lgamma(N-Y+B) - Lgamma(N+A+B)  )
}

opt_three <- optim(c(1,1),loglik, method = "L-BFGS-B", lower=c(0,0))
opt_three