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);
}
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);
}
3. ParallelEnumerable.Range
Generates a range of numbers in parallel.
var parallelRange = ParallelEnumerable.Range(1, 10);
parallelRange.ForAll(Console.WriteLine);
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);
5. ParallelEnumerable.Empty
Returns an empty parallel sequence.
var emptySequence = ParallelEnumerable.Empty<int>();
Console.WriteLine("Count: " + emptySequence.Count());
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);
}
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);
}
8. AsUnordered
Removes ordering constraints for better parallel performance.
var numbers = Enumerable.Range(1, 10).AsParallel().AsUnordered();
numbers.ForAll(Console.WriteLine);
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.");
}
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);
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);
12. ForAll
Executes a parallel query and applies an action to each element.
var numbers = Enumerable.Range(1, 10).AsParallel();
numbers.ForAll(Console.WriteLine);
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.
Top comments (0)