所以主题就是问题。
我得到该方法 AsParallel 返回ParallelQuery<TSource>
使用相同 LINQ 关键字的包装器,但来自System.Linq.ParallelEnumerable
而不是System.Linq.Enumerable
很清楚,但是当我查看反编译的源时,我不明白它是如何工作的。
让我们从一个最简单的扩展开始:Sum() 方法。代码:
[__DynamicallyInvokable]
public static int Sum(this ParallelQuery<int> source)
{
if (source == null)
throw new ArgumentNullException("source");
else
return new IntSumAggregationOperator((IEnumerable<int>) source).Aggregate();
}
很清楚,让我们去Aggregate()
方法。它是 InternalAggregate 方法的包装器,可以捕获一些异常。现在让我们来看看它。
protected override int InternalAggregate(ref Exception singularExceptionToThrow)
{
using (IEnumerator<int> enumerator = this.GetEnumerator(new ParallelMergeOptions?(ParallelMergeOptions.FullyBuffered), true))
{
int num = 0;
while (enumerator.MoveNext())
checked { num += enumerator.Current; }
return num;
}
}
问题是:它是如何工作的?我看不到变量的并发安全性,由许多线程修改,我们只看到迭代器和求和。它是魔术枚举器吗?或者它是如何工作的?GetEnumerator()
返回QueryOpeningEnumerator<TOutput>
,但它的代码太复杂了。