并以“同样的事情,”我是说这两个操作基本上做同样的工作,它只是归结为哪一个更方便的基础上,你有什么与合作打电话? (即委托列表或一个事物的列表遍历)? 我一直在寻找的MSDN,StackOverflow上,和各种随机文章,但我还没有找到这个明确的答案。
编辑: 我本来应该更清晰; 我问,如果这两种方法做同样的事情,因为如果他们不这样做,我想明白这将是更有效的。
例如:我有500个键值的列表。 目前我使用一个foreach循环遍历列表(串行),并为每个项目执行工作。 如果我想利用多核心的优势,我应该简单地使用Parallel.ForEach呢? 让我们说的论据的缘故,我有500人,适合那些500级的任务组 - 将其净效应是任何不同的调用Parallel.Invoke,给它的500名代表名单?
提前谢谢了!
Parallel.ForEach
经过元素的列表,并可以在数组中的元素执行一些任务。
例如。
Parallel.ForEach(val, (array) => Sum(array));
Parallel.Invoke
可以并行调用许多功能。
例如。
Parallel.Invoke(
() => doSum(array),
() => doAvg(array),
() => doMedian(array));
从上面的例子中,你可以看到,他们在功能上有所不同。 ForEach
通过迭代List
元素和并行执行的每个元件上的一个任务 ,而Invoke
可以并行单个元件上执行许多任务 。
Parallel.Invoke和Parallel.ForEach(用于执行操作时)功能相同,虽然是一个特别希望收集是一个数组。 考虑下面的示例:
List<Action> actionsList = new List<Action>
{
() => Console.WriteLine("0"),
() => Console.WriteLine("1"),
() => Console.WriteLine("2"),
() => Console.WriteLine("3"),
() => Console.WriteLine("4"),
() => Console.WriteLine("5"),
() => Console.WriteLine("6"),
() => Console.WriteLine("7"),
() => Console.WriteLine("8"),
() => Console.WriteLine("9"),
};
Parallel.ForEach<Action>(actionsList, ( o => o() ));
Console.WriteLine();
Action[] actionsArray = new Action[]
{
() => Console.WriteLine("0"),
() => Console.WriteLine("1"),
() => Console.WriteLine("2"),
() => Console.WriteLine("3"),
() => Console.WriteLine("4"),
() => Console.WriteLine("5"),
() => Console.WriteLine("6"),
() => Console.WriteLine("7"),
() => Console.WriteLine("8"),
() => Console.WriteLine("9"),
};
Parallel.Invoke(actionsArray);
Console.ReadKey();
此代码生成一个运行此输出。 它的输出通常是按照不同的顺序每次。
0 5 1 6 2 7 3 8 4 9
0 1 2 4 5 6 7 8 9 3
我试图找到它措辞的好方法; 但它们不是一回事。
其原因是,调用适用于操作的数组和foreach适用于动作的列表(具体一个IEnumerable); 列表是显著不同的力学阵列虽然他们暴露同一类的基本行为。
我不能说有什么区别实际需要,因为我不知道,所以请不要接受这样的一个答案(除非你真的想太多!),但我希望它慢跑某人内存的机制。
+1一个很好的问题了。
编辑; 它只是发生在我身上,还有另一种回答过; 调用可以操作的动态列表上工作; 但FOREACH可以操作的通用IEnumerable的工作,给你的行动使用条件逻辑,行动的能力; 所以你可以在每个迭代的foreach说Action.Invoke()之前测试的条件。