ParallelQuery与接受IEnumerable的方法

时间:2014-05-31 19:41:46

标签: c# .net linq parallel-extensions

我有一个接受IEnumerable(下面定义的AMethod)的方法,调用Select扩展方法并返回结果。从返回的结果中,我调用了一个长时间运行的操作。

如果我传入AMethod的对象是ParallelQuery,上述场景的行为会如何变化?

我的目标是使整个操作尽可能并行。我担心的是扩展方法是编译时间和“选择”。即使我传入的对象是ParalellQuery,AMethod内部的方法也不是并行版本。

我认为这是一个常见的场景,并且有一个食谱解决方案?我是否必须为每个方法创建2个版本 - 一个接受/返回IEnumerable,另一个接受/返回ParallelQuery?

void TestMethod(ICollection<int> coln)
{
    var result = AMehod(coln.AsParallel()).Select(LongRunningFunction).Sum();
}

IEnumerable<int> AMethod(IEnumerable<int> param)
{
    return param.Select(func());
}

int LongRunningFunction(T funcion)
{
   // do complex database query and return the results
}

1 个答案:

答案 0 :(得分:1)

你是对的,AMethod将使用LINQ对象(没有并行性)。您确实需要两个专门的函数,因为L2O和PLinq使用不同的静态查询方法(EnumerableParallelEnumerable)。 (或者你使用反射,我觉得这里太多了。)

您可以通过调用AsParallel中的适配器方法AMethod来完成此工作。 AsParallel检查参数是否是并行查询,如果是,则直接使用它。