讓我們看看生成的代碼(反編譯,當然):
private static void WithLet(IEnumerable<int> items)
{
ParallelEnumerable.Select(ParallelEnumerable.Select(ParallelEnumerable.AsParallel<int>(items), item =>
{
var local_0 = new
{
item = item,
result = Program.DoExpensiveWork(item)
};
return local_0;
}), param0 => param0.result);
}
private static void WithoutLet(IEnumerable<int> items)
{
ParallelEnumerable.Select<int, object>(ParallelEnumerable.AsParallel<int>(items), (Func<int, object>) (item => Program.DoExpensiveWork(item)));
}
我們可以看到這兩種方法之間的唯一區別是,一箇中間局部變量創建。對本地變量的賦值不會改變程序的行爲。
要更具體地回答您的問題,強制執行並行的代碼實際上是對ParallelEnumerable.AsParallel
的調用。 LINQ查詢僅在枚舉時執行,因此它可以理解爲它是IEnumerable<>
的生成器,它指定它是否並行執行。
輸出結果是相同的,兩個查詢的並行執行也沒有區別。 – MarcinJuraszek