/// <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))); }
/// <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); }