我有一个接受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
}
答案 0 :(得分:1)
你是对的,AMethod
将使用LINQ对象(没有并行性)。您确实需要两个专门的函数,因为L2O和PLinq使用不同的静态查询方法(Enumerable
与ParallelEnumerable
)。 (或者你使用反射,我觉得这里太多了。)
您可以通过调用AsParallel
中的适配器方法AMethod
来完成此工作。 AsParallel
检查参数是否是并行查询,如果是,则直接使用它。