C#Parallel.Invoke:委托实际创建的时间是什么时候?

时间:2017-08-27 19:48:29

标签: c# .net task-parallel-library

我是.NET中Parallel类的新手。我有这个基本代码:

<Parent>

我希望这会以一些随机顺序打印1..5,但是它会在循环结束后打印出iter的值。

这是为什么?实际创建的动作在什么时候执行, List<Action> actions = new List<Action>(); for (int iter = 1; iter <= 5; iter++) { actions.Add(() => { // create a local copy of iter, and an action to write it to the console int theProblem = iter; Console.WriteLine(theProblem); }); } Parallel.Invoke(actions.ToArray()); /* Output: 6 6 6 6 6 */ 行?

我在网上找到了一些关于Parallel.For和Parallel.ForEach的信息(对于Parallel.Invoke来说不是那么多),但没有具体解释在这个非常基本的情况下会发生什么。

我需要做些什么修改才能让上面的代码打印1..5(以某种随机顺序)?

非常感谢!

编辑:

此问题已被标记为重复,但我认为不是:

  • 除了另一个问题中的一个回复之外的所有回复都引用了sigle-threaded代码,这是多线程的。

  • 没有任何响应引用Parallel.Invoke(或者并行类中的任何其他方法)。

  • 我的代码示例已经实现了另一个问题中提出的解决方案(在循环内创建变量的副本),但它无效。

所以,显然不是骗局。

编辑2:

事实证明,这实际上是一个骗局。它的要点是在循环内创建变量的本地副本但在lambda之外(duh!)然后一切都按预期工作。

谢谢大家!

0 个答案:

没有答案