2013-09-21 27 views
3

在xamarin iOS網站上有以下並行linq示例。讓let子句並行linq強制並行評估?

from item in items.AsParallel() 
    let result = DoExpensiveWork (item) 
    select result; 

難道這不是已經被寫入

from item in items.AsParallel() 
    select DoExpensiveWork (item); 

或者是有let子句理由嗎?這是否強迫它被並行評估?

+0

輸出結果是相同的,兩個查詢的並行執行也沒有區別。 – MarcinJuraszek

回答

4

讓我們看看生成的代碼(反編譯,當然):

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<>的生成器,它指定它是否並行執行。