C# 使用 AsParallel 包装数组初始化 - 表达式树
C# Wrap array initialization with AsParallel - Expression Trees
如何用 ParallelEnumerable.AsParallel 包装 NewArrayExpression ?
例如我有表示下一个代码的表达式:
var data = new int {1, 2, 3, 4, 5};
我想要得到的结果:
var data = new int {1, 2, 3, 4, 5}.AsParallel();
我尝试使用 ExpressionVisitor 和 VisitNewArray 方法:
protected override Expression VisitNewArray(NewArrayExpression node)
{
var source = Expression.Parameter(typeof(IEnumerable<>).MakeGenericType(typeof(MethodCallExpression)), "source");
var asParallel =
Expression.Call(
typeof(ParallelEnumerable),
nameof(ParallelEnumerable.AsParallel),
new[] { typeof(ParallelQuery<MethodCallExpression>) },
source
);
return ***???***
}
但是不知道如何正确"wrap"node.Expressions这个Expression.Call
感谢您的任何建议!
这样做会将表达式类型从 T[]
更改为 ParallelQuery<T>
,这可能会导致问题。
但是回答你的具体问题。让我们重写你的例子
var data = new int[] {1, 2, 3, 4, 5}.AsParallel();
如下
var newArray = new int[] { 1, 2, 3, 4, 5 };
var data = newArray.AsParallel();
现在考虑到AsParallel
是泛型静态扩展方法,去除编译糖后的实际调用是
var data = ParallelEnumerable.AsParallel<int>(newArray);
换句话说,调用传递数组元素类型作为泛型类型参数和 new
数组表达式作为参数的泛型静态方法。例如
protected override Expression VisitNewArray(NewArrayExpression node)
{
var asParallel = Expression.Call(
typeof(ParallelEnumerable),
nameof(ParallelEnumerable.AsParallel),
new [] { node.Type.GetElementType() },
node
);
return asParallel;
}
如何用 ParallelEnumerable.AsParallel 包装 NewArrayExpression ?
例如我有表示下一个代码的表达式:
var data = new int {1, 2, 3, 4, 5};
我想要得到的结果:
var data = new int {1, 2, 3, 4, 5}.AsParallel();
我尝试使用 ExpressionVisitor 和 VisitNewArray 方法:
protected override Expression VisitNewArray(NewArrayExpression node)
{
var source = Expression.Parameter(typeof(IEnumerable<>).MakeGenericType(typeof(MethodCallExpression)), "source");
var asParallel =
Expression.Call(
typeof(ParallelEnumerable),
nameof(ParallelEnumerable.AsParallel),
new[] { typeof(ParallelQuery<MethodCallExpression>) },
source
);
return ***???***
}
但是不知道如何正确"wrap"node.Expressions这个Expression.Call
感谢您的任何建议!
这样做会将表达式类型从 T[]
更改为 ParallelQuery<T>
,这可能会导致问题。
但是回答你的具体问题。让我们重写你的例子
var data = new int[] {1, 2, 3, 4, 5}.AsParallel();
如下
var newArray = new int[] { 1, 2, 3, 4, 5 };
var data = newArray.AsParallel();
现在考虑到AsParallel
是泛型静态扩展方法,去除编译糖后的实际调用是
var data = ParallelEnumerable.AsParallel<int>(newArray);
换句话说,调用传递数组元素类型作为泛型类型参数和 new
数组表达式作为参数的泛型静态方法。例如
protected override Expression VisitNewArray(NewArrayExpression node)
{
var asParallel = Expression.Call(
typeof(ParallelEnumerable),
nameof(ParallelEnumerable.AsParallel),
new [] { node.Type.GetElementType() },
node
);
return asParallel;
}