并行化表达式树的推荐机制是什么?

时间:2011-08-01 13:21:43

标签: c# expression-trees task-parallel-library

给出了我正在序列化的场景&反序列化在IEnumerable上运行的表达式树,用于分布式处理扩展,我还希望自动化扩展: 在执行此表达式树时,我想应用TPL AsParallel()运算符。

这样做的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

不确定问题出在哪里。我假设你想要

IEnumerable<string> enumerable = new List<string>();
Expression<Func<IEnumerable<string>, IEnumerable<bool>>> expression = a => a.Select(b => b == true);

自动放大和缩小。问题是,AsParallel()只返回一个实现不同GetEnumerator()方法的类。它仍然在IEnumerable&lt; T&gt;上运行。接口。那你为什么不实施

Expression<Func<ParallelQuery<TSource>, IEnumerable<bool>>> expression = a => a.Select(b => b == true);

默认情况下?然后有类似的东西:

void Execute(Expression<Func<ParallelQuery<string>, IEnumerable<bool>>> expression, IEnumerable<string> strings)
{
    ParallelQuery<string> parStrings;
    if (!typeof (ParallelQuery<string>).IsAssignableFrom(strings.GetType()))
        parStrings = strings as ParallelQuery<string>;
    else
        parStrings = strings.AsParallel();

    expression.Compile()(parStrings);
}

长话短说。让你的表达式在ParallelQuery&lt; T&gt;上运行默认情况下,转换您的IEnumerable&lt; T&gt;到ParallelQuery&lt; T&gt;。否则,您将查看节点遍历/查询重组。 (不确定这是否可以回答你的问题。但无论如何都要喋喋不休。)

只是注意警告Expression.Compile()是一个非常繁重的方法。如果您想要表现,请尽可能避免。