Ejemplo n.º 1
0
        /// <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);
        }