查询中的C#PLINQ .AsParallel()位置

时间:2016-02-25 09:15:35

标签: c# linq parallel-processing

的StackOverflow,

在C#PLINQ中,我理解“.AsParallel()”的位置会影响查询的运行方式。例如,在查询中间出现“.AsParallel()”,它将在方法之前顺序执行,并在方法之后并行执行。 (PLINQ: Parallel Queries in .NET)。

我的问题是,使用更复杂的查询(下面),其中“.AsParallel”出现在查询的开头(作为.Select的前缀),所有后续方法是否也会执行并行? (目前,“。AsParallel”出现在.Select)之后。

  Collection =
   typeof (Detail).GetProperties(BindingFlags.Public | BindingFlags.Instance)
     .SelectMany(propertyInfo => recentPhases
      .Where(phase => phase.Finalised)
      .SelectMany(phase => phase.PhaseDetail
      .Select(keyValuePair => new
     {
      phase.Direction,
      phase.Momentum,
      keyValuePair.Key,
      keyValuePair.Value
     }))
     .Select(arg => new
     {
      Key = new BmkKey
      {
       Direction = (arg.Direction == Dir.Up ? Dir.Up : Dir.Down),
       Momentum = (arg.Momentum == Mom.Price ? Mom.Price : Mom.Time),
       BarNumber = arg.Key,
       DetailType = propertyInfo.Name
      },
      Value = (double) propertyInfo.GetValue(arg.Value, null)
     }))
    .AsParallel().GroupBy(grp => grp.Key)
    .ToDictionary(grp => grp.Key, grp => new Distribution(grp.Select(x => x.Value)));

1 个答案:

答案 0 :(得分:0)

是的,在调用AsParallel()方法后,所有内容都将并行执行。来自msdn:

public static ParallelQuery<TSource> AsParallel<TSource>(
this IEnumerable<TSource> source)

因此输入为IEnumerable<T>,输出为ParallelQuery<T>

如果我们再查看ParallelEnumerable class

  

提供一组查询实现ParallelQuery {TSource}的对象的方法。这是Enumerable的并行等价物。

因此,从那时起,您将不会调用为IEnumerable<T>定义的方法,但您将调用为ParallelEnumerable定义的并行对应方。