C# - 是Parallel.Invoke和Parallel.ForEach本质上是一回事吗?(C#

2019-06-25 03:46发布

并以“同样的事情,”我是说这两个操作基本上做同样的工作,它只是归结为哪一个更方便的基础上,你有什么与合作打电话? (即委托列表或一个事物的列表遍历)? 我一直在寻找的MSDN,StackOverflow上,和各种随机文章,但我还没有找到这个明确的答案。

编辑: 我本来应该更清晰; 我问,如果这两种方法做同样的事情,因为如果他们不这样做,我想明白这将是更有效的。

例如:我有500个键值的列表。 目前我使用一个foreach循环遍历列表(串行),并为每个项目执行工作。 如果我想利用多核心的优势,我应该简单地使用Parallel.ForEach呢? 让我们说的论据的缘故,我有500人,适合那些500级的任务组 - 将其净效应是任何不同的调用Parallel.Invoke,给它的500名代表名单?

提前谢谢了!

Answer 1:

Parallel.ForEach经过元素的列表,并可以在数组中的元素执行一些任务。

例如。

Parallel.ForEach(val, (array) => Sum(array));

Parallel.Invoke可以并行调用许多功能。

例如。

Parallel.Invoke(
() => doSum(array),
() => doAvg(array),
() => doMedian(array));

从上面的例子中,你可以看到,他们在功能上有所不同。 ForEach通过迭代List元素和并行执行的每个元件上的一个任务 ,而Invoke可以并行单个元件上执行许多任务



Answer 2:

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



Answer 3:

我试图找到它措辞的好方法; 但它们不是一回事。

其原因是,调用适用于操作的数组和foreach适用于动作的列表(具体一个IEnumerable); 列表是显著不同的力学阵列虽然他们暴露同一类的基本行为。

我不能说有什么区别实际需要,因为我不知道,所以请不要接受这样的一个答案(除非你真的想太多!),但我希望它慢跑某人内存的机制。

+1一个很好的问题了。

编辑; 它只是发生在我身上,还有另一种回答过; 调用可以操作的动态列表上工作; 但FOREACH可以操作的通用IEnumerable的工作,给你的行动使用条件逻辑,行动的能力; 所以你可以在每个迭代的foreach说Action.Invoke()之前测试的条件。



文章来源: C# - Are Parallel.Invoke and Parallel.ForEach essentially the same thing?