C# 具有接受IEnumerable的方法的并行查询

C# 具有接受IEnumerable的方法的并行查询,c#,.net,linq,parallel-extensions,C#,.net,Linq,Parallel Extensions,我有一个方法,它接受IEnumerable(下面定义的method),调用Select扩展方法并返回结果。根据返回的结果,我调用了一个长时间运行的操作 如果我传递给AMethod的对象是ParallelQuery,那么上述场景的行为会发生什么变化 void TestMethod(ICollection<int> coln) { var result = AMehod(coln.AsParallel()).Select(LongRunningFunction).Sum(); }

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

如果我传递给AMethod的对象是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
}
我的目标是使整个操作尽可能并行。我担心的是,扩展方法是编译时的,而AMethod中的“Select”方法不是并行版本,即使我传入的对象是并行查询

我假设这是一个常见的场景,并且有一个食谱解决方案?我必须为每个方法创建两个版本吗?一个接受/返回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
}
void测试方法(ICollection coln)
{
var result=AMehod(coln.AsParallel()).Select(LongRunningFunction.Sum();
}
IEnumerable方法(IEnumerable参数)
{
返回参数Select(func());
}
int LongRunningFunction(T函数)
{
//执行复杂的数据库查询并返回结果
}

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


您可以通过调用
AMethod
中的适配器方法
AsParallel
来实现这一点
AsParallel
检查参数是否为并行查询,如果是,则直接使用它。

感谢您的回复。