LINQ的AsParallel
返回ParallelQuery
。我想知道是否可以改变这种行为,以便我可以比较LINQ语句运行与没有并行而不用实际更改代码?此行为应类似于Debug.Assert
- 如果未设置DEBUG
预处理程序指令,则会对其进行优化。因此,我希望能够使AsParallel
返回相同的类型而不将其转换为ParallelQuery
。
我想我可以声明自己的扩展方法(因为我无法覆盖AsParallel
)并在其中分析了预处理器指令:
public static class MyExtensions
{
#if TURN_OFF_LINQ_PARALLELISM
public static IEnumerable<T> AsControllableParallel<T>(this IEnumerable<T> enumerable)
{
return enumerable;
}
#else
public static ParallelQuery<T> AsControllableParallel<T>(this IEnumerable<T> enumerable)
{
return enumerable.AsParallel();
}
#endif
}
我想知道是否还有其他办法。我要求的太多了吗?
答案 0 :(得分:2)
您可以创建自己的扩展方法,并将它们转发到发布版本中的“真实”AsParallel方法,并在调试版本中使用顺序方法。通过检查当前命名空间中的方法来解析扩展方法,然后搜索“外部”命名空间(实例方法仍然是首选)。
class NonParallelQuery
{
IEnumerable _data;
public NonParallelQuery(IEnumerable data)
{
_data = data;
}
public IEnumerator GetEnumerator()
{
return _data.GetEnumerator();
}
}
static class Extensions
{
public static NonParallelQuery AsParallel(this IEnumerable source)
{
#if DEBUG
return new NonParallelQuery(ParallelEnumerable.AsParallel(source));
#else
return new NonParallelQuery(source);
#endif
}
}
public partial class Form1 : Form
{
public Form1()
{
var data = new string[] { "first", "second" };
foreach (var str in data.Select(x => x.ToString()).AsParallel())
{
Debug.Print("Value {0}", str);
}
InitializeComponent();
}
答案 1 :(得分:2)
怎么样?
var result =
source
#if TURN_ON_LINQ_PARALLELISM
.AsParallel()
#endif
.Select(value => value.StartsWith("abcd"));