/// <summary>This is the method to opt into Parallel LINQ.</summary> /// <typeparam name="TSource">Specifies the type of elements provided to the query.</typeparam> /// <param name="source">The source query.</param> /// <param name="parallelOptions">The options to use for query processing.</param> /// <returns>The source as a ParallelQuery to bind to ParallelEnumerable extension methods.</returns> public static ParallelQuery <TSource> AsParallel <TSource>( this IEnumerable <TSource> source, ParallelLinqOptions parallelOptions) { if (source == null) { throw new ArgumentNullException("source"); } // Validate unsupported options if (parallelOptions.TaskScheduler != null && parallelOptions.TaskScheduler != TaskScheduler.Default) { throw new ArgumentException("Parallel LINQ only supports the default TaskScheduler."); } // First convert to PLINQ var result = source.AsParallel(); // Then apply all of the options as requested... if (parallelOptions.Ordered) { result = result.AsOrdered(); } if (parallelOptions.CancellationToken.CanBeCanceled) { result = result.WithCancellation(parallelOptions.CancellationToken); } if (parallelOptions.MaxDegreeOfParallelism >= 1) { result = result.WithDegreeOfParallelism(parallelOptions.MaxDegreeOfParallelism); } if (parallelOptions.ExecutionMode != ParallelExecutionMode.Default) { result = result.WithExecutionMode(parallelOptions.ExecutionMode); } if (parallelOptions.MergeOptions != ParallelMergeOptions.Default) { result = result.WithMergeOptions(parallelOptions.MergeOptions); } return(result); }
/// <summary>This is the method to opt into Parallel LINQ.</summary> /// <typeparam name="TSource">Specifies the type of elements provided to the query.</typeparam> /// <param name="source">The source query.</param> /// <param name="parallelOptions">The options to use for query processing.</param> /// <returns>The source as a ParallelQuery to bind to ParallelEnumerable extension methods.</returns> public static ParallelQuery <TSource> AsParallel <TSource>(this IEnumerable <TSource> source, ParallelLinqOptions parallelOptions) { if (source == null) { throw new ArgumentNullException("source"); } if ((parallelOptions.TaskScheduler != null) && (parallelOptions.TaskScheduler != TaskScheduler.Default)) { throw new ArgumentException("Parallel LINQ only supports the default TaskScheduler."); } ParallelQuery <TSource> query = source.AsParallel <TSource>(); if (parallelOptions.Ordered) { query = query.AsOrdered <TSource>(); } if (parallelOptions.CancellationToken.CanBeCanceled) { query = query.WithCancellation <TSource>(parallelOptions.CancellationToken); } if (parallelOptions.MaxDegreeOfParallelism >= 1) { query = query.WithDegreeOfParallelism <TSource>(parallelOptions.MaxDegreeOfParallelism); } if (parallelOptions.ExecutionMode != ParallelExecutionMode.Default) { query = query.WithExecutionMode <TSource>(parallelOptions.ExecutionMode); } if (parallelOptions.MergeOptions != ParallelMergeOptions.Default) { query = query.WithMergeOptions <TSource>(parallelOptions.MergeOptions); } return(query); }