【问题标题】:ParallelQuery with methods that take in an IEnumerable带有接受 IEnumerable 的方法的 ParallelQuery
【发布时间】:2014-07-21 08:40:17
【问题描述】:

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

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

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

我认为这是一种常见情况,并且有一个食谱解决方案吗?我是否必须为每种方法创建 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
}

【问题讨论】:

    标签: c# .net linq parallel-extensions


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多