DEV Community

Cover image for PLINQ Extension Methods in C#
Common Khadka
Common Khadka

Posted on

PLINQ Extension Methods in C#

Parallel LINQ (PLINQ) is an extension of LINQ that enables parallel processing of queries to improve performance by utilizing multiple cores of a processor. Below is a list of PLINQ extension methods along with code snippets demonstrating their usage.


1. AsParallel

Converts an IEnumerable to a parallel query, enabling parallel execution.

var numbers = Enumerable.Range(1, 10);
var parallelQuery = numbers.AsParallel().Where(n => n % 2 == 0);
foreach (var num in parallelQuery)
{
    Console.WriteLine(num);
}
Enter fullscreen mode Exit fullscreen mode

2. WithDegreeOfParallelism

Limits the number of processor cores used for the query execution.

var numbers = Enumerable.Range(1, 20);
var parallelQuery = numbers.AsParallel()
                           .WithDegreeOfParallelism(2) // Limits to 2 cores
                           .Where(n => n % 2 == 0);
foreach (var num in parallelQuery)
{
    Console.WriteLine(num);
}
Enter fullscreen mode Exit fullscreen mode

3. ParallelEnumerable.Range

Generates a range of numbers in parallel.

var parallelRange = ParallelEnumerable.Range(1, 10);
parallelRange.ForAll(Console.WriteLine);
Enter fullscreen mode Exit fullscreen mode

4. ParallelEnumerable.Repeat

Generates a sequence where a specified value is repeated multiple times in parallel.

var repeatedValues = ParallelEnumerable.Repeat("Hello", 5);
repeatedValues.ForAll(Console.WriteLine);
Enter fullscreen mode Exit fullscreen mode

5. ParallelEnumerable.Empty

Returns an empty parallel sequence.

var emptySequence = ParallelEnumerable.Empty<int>();
Console.WriteLine("Count: " + emptySequence.Count());
Enter fullscreen mode Exit fullscreen mode

6. AsSequential

Forces a PLINQ query to process sequentially instead of in parallel.

var numbers = Enumerable.Range(1, 10).AsParallel();
var sequentialQuery = numbers.AsSequential().Where(n => n % 2 == 0);
foreach (var num in sequentialQuery)
{
    Console.WriteLine(num);
}
Enter fullscreen mode Exit fullscreen mode

7. AsOrdered

Preserves the ordering of the original sequence in a PLINQ query.

var numbers = Enumerable.Range(1, 10).AsParallel().AsOrdered();
foreach (var num in numbers)
{
    Console.WriteLine(num);
}
Enter fullscreen mode Exit fullscreen mode

8. AsUnordered

Removes ordering constraints for better parallel performance.

var numbers = Enumerable.Range(1, 10).AsParallel().AsUnordered();
numbers.ForAll(Console.WriteLine);
Enter fullscreen mode Exit fullscreen mode

9. WithCancellation

Enables cancellation of a PLINQ query using a CancellationToken.

var cts = new CancellationTokenSource();
var numbers = Enumerable.Range(1, 100).AsParallel().WithCancellation(cts.Token);
Task.Run(() => cts.Cancel());
try
{
    foreach (var num in numbers)
    {
        Console.WriteLine(num);
    }
}
catch (OperationCanceledException)
{
    Console.WriteLine("Query was canceled.");
}
Enter fullscreen mode Exit fullscreen mode

10. WithMergeOptions

Specifies how results should be merged after parallel execution.

var numbers = Enumerable.Range(1, 10).AsParallel()
                        .WithMergeOptions(ParallelMergeOptions.NotBuffered);
numbers.ForAll(Console.WriteLine);
Enter fullscreen mode Exit fullscreen mode

11. WithExecutionMode

Forces a query to run in parallel or sequential mode.

var numbers = Enumerable.Range(1, 10).AsParallel()
                        .WithExecutionMode(ParallelExecutionMode.ForceParallelism);
numbers.ForAll(Console.WriteLine);
Enter fullscreen mode Exit fullscreen mode

12. ForAll

Executes a parallel query and applies an action to each element.

var numbers = Enumerable.Range(1, 10).AsParallel();
numbers.ForAll(Console.WriteLine);
Enter fullscreen mode Exit fullscreen mode

Conclusion

PLINQ provides powerful methods to enable efficient parallel processing in C#. Understanding these methods can help improve performance in applications that handle large data processing tasks.


References


Top comments (0)