给出了我正在序列化的场景&反序列化在IEnumerable上运行的表达式树,用于分布式处理扩展,我还希望自动化扩展: 在执行此表达式树时,我想应用TPL AsParallel()运算符。
这样做的最佳做法是什么?
答案 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()是一个非常繁重的方法。如果您想要表现,请尽可能避免。