C# - Are Parallel.Invoke and Parallel.ForEach essentially the same thing?
Parallel.ForEach
goes through the list of elements and can perform some task on the elements of the array.
eg.
Parallel.ForEach(val, (array) => Sum(array));
Parallel.Invoke
can invoke many functions in parallel.
eg.
Parallel.Invoke(
() => doSum(array),
() => doAvg(array),
() => doMedian(array));
As from the example above, you can see that they are different in functionality. ForEach
iterates through a List
of elements and performs one task on each element in parallel, while Invoke
can perform many tasks in parallel on a single element.
Parallel.Invoke and Parallel.ForEach (when used to execute Actions) function the same, although yes one specifically wants the collection to be an Array. Consider the following sample:
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();
This code produces this output on one Run. It's output is generally in a different order every time.
0 5 1 6 2 7 3 8 4 9
0 1 2 4 5 6 7 8 9 3