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

Bra*_*gne 18 .net c# parallel-processing multithreading .net-4.0

并且"同样的事情"我的意思是这两个操作基本上做同样的工作,它只是归结为哪个更方便根据你必须使用的工作来调用?(即代表列表或迭代的事项列表)?我一直在搜索MSDN,StackOverflow和各种随机文章,但我还没有找到一个明确的答案.

编辑: 我应该更清楚; 我问这两种方法是否做同样的事情,因为如果他们不这样做,我想了解哪种方法会更有效率.

示例:我有500个键值的列表.目前我使用foreach循环遍历列表(连续)并执行每个项目的工作.如果我想利用多个内核,我应该简单地使用Parallel.ForEach吗?让我们说为了参数的缘故,我为这500个任务组成了一个500个代表的数组 - 是否会产生任何不同的调用Parallel.Invoke,给它一个500个代表的列表?

提前谢谢了!

May*_*ank 25

Parallel.ForEach 浏览元素列表,可以对数组元素执行一些任务.

例如.

Parallel.ForEach(val, (array) => Sum(array));
Run Code Online (Sandbox Code Playgroud)

Parallel.Invoke 可以并行调用许多函数.

例如.

Parallel.Invoke(
() => doSum(array),
() => doAvg(array),
() => doMedian(array));
Run Code Online (Sandbox Code Playgroud)

从上面的示例中,您可以看到它们的功能不同.ForEach通过迭代List元素,并执行一个任务的每个元件并联,而Invoke可以执行许多任务平行的上单个元件.

  • “Parallel.ForEach ...可以对数组的元素执行一些任务。” 那么如果我的任务是调用一个函数怎么办?与 Parallel.Invoke 相比,在工作完成方式以及其中一个是否会优于另一个方面有什么真正的区别吗? (2认同)

plu*_*ich 10

Parallel.Invoke和Parallel.ForEach(当用于执行Actions时)功能相同,虽然是的,特别希望集合是一个数组.请考虑以下示例:

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();
Run Code Online (Sandbox Code Playgroud)

此代码在一次运行中生成此输出.它的输出通常每次都以不同的顺序排列.

0 5 1 6 2 7 3 8 4 9

0 1 2 4 5 6 7 8 9 3