Esempio n. 1
0
        /// <summary>
        /// <paramref name="options"/>에 따라 ParallelQuery{TSource} 를 빌드합니다.
        /// </summary>
        /// <typeparam name="TSource"></typeparam>
        /// <param name="source"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public static ParallelQuery <TSource> AsParallel <TSource>(this IEnumerable <TSource> source, ParallelOptions options)
        {
            source.ShouldNotBeNull("source");
            options = options ?? ParallelTool.DefaultParallelOptions;

            return(AsParallel(source, ParallelLinqOptions.CreateFrom(options)));
        }
Esempio n. 2
0
        /// <summary>
        /// <paramref name="options"/>에 따라 ParallelQuery{TSource} 를 빌드합니다.
        /// </summary>
        /// <typeparam name="TSource"></typeparam>
        /// <param name="source"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public static ParallelQuery <TSource> AsParallel <TSource>(this IEnumerable <TSource> source, ParallelLinqOptions options = null)
        {
            source.ShouldNotBeNull("source");
            options = options ?? ParallelLinqOptions.CreateFrom(ParallelTool.DefaultParallelOptions);

            if (options.TaskScheduler != null && options.TaskScheduler != TaskScheduler.Default)
            {
                throw new InvalidOperationException("Parallel LINQ 는 기본 TaskScheduler만 지원합니다. " +
                                                    "options.TaskScheduler는 TaskScheduler.Default가 아닙니다.");
            }

            if (IsDebugEnabled)
            {
                log.Debug("병렬 옵션을 기준으로 PLINQ로 변환합니다...  options=[{0}]", options.ObjectToString());
            }

            var result = source.AsParallel();

            if (options.Ordered)
            {
                result = result.AsOrdered();
            }

            if (options.CancellationToken.CanBeCanceled)
            {
                result = result.WithCancellation(options.CancellationToken);
            }

            if (options.MaxDegreeOfParallelism >= 1)
            {
                result = result.WithDegreeOfParallelism(options.MaxDegreeOfParallelism);
            }

            if (options.ExecutionMode != ParallelExecutionMode.Default)
            {
                result = result.WithExecutionMode(options.ExecutionMode);
            }

            if (options.MergeOptions != ParallelMergeOptions.Default)
            {
                result = result.WithMergeOptions(options.MergeOptions);
            }

            return(result);
        }