我是.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!)然后一切都按预期工作。
谢谢大家!