Parallel LINQ in .NET C#: a basic example
June 8, 2017 Leave a comment
Parallel LINQ – PLINQ – can be applied to LINQ to Objects. This type of LINQ which works with the IEnumerable and IEnumerable of T data types. There are extension methods in the PLINQ library that make parallel processing of the result from queries available. The result is that multiple data items are processed concurrently.
In fact it is not difficult to transform a “normal” LINQ statement to PLINQ.
Set up the data source:
int[] sourceData = new int[1000]; for (int i = 0; i < sourceData.Length; i++) { sourceData[i] = i; }
We want to extract all even numbers. We also want the items to be processed in a parallel fashion. The following query will do just that:
IEnumerable<int> parallelResults = from item in sourceData.AsParallel() where item % 2 == 0 select item;
Note the AsParallel() extension method. Behind the scenes it creates an instance of the ParallelQuery class. Without the AsParallel extension you’d be using standard LINQ features hidden in the Enumerable class. This little extension makes sure that the parallel features are used instead.
Print the results:
foreach (int item in parallelResults) { Console.WriteLine("Item {0}", item); }
Run the code and you’ll see that the integers do not follow any particular order. This is the result of the parallel execution of the query. Remove the AsParallel extension from the query and integers will be presented in an ascending order. The method hides a lot of complexity from the programmer. It is up to PLINQ to decide how the query will be parallelised, we only indicate the request through the extension. PLINQ will try to optimise the query execution based on a range of parameters. If sequential execution seems to be a better fit then the items may still be processed sequentially despite your wish.
View the list of posts on the Task Parallel Library here.