關於Parallel.For/Foreach並行方法中的localInit, body, localFinally使用

對集合成員的操做每每能夠經過並行來提升效率,.NET Parallel類提供了簡單的方法來幫助咱們實現這種並行,好比Paralle.For/ForEach/Invoke方法。函數

其中,For/ForEach方法提供了重載,容許咱們提供3個delegate,來實現對thread行爲的控制。oop

函數聲明以下:spa

public static ParallelLoopResult ForEach<TSource, TLocal>(IEnumerable<TSource> source, it

Func<TLocal> localInit, io

Func<TSource, ParallelLoopState, long, TLocal, TLocal> body, thread

Action<TLocal> localFinally); 效率

 

public static ParallelLoopResult ForEach<TSource, TLocal>(IEnumerable<TSource> source, 並行

Func<TLocal> localInit, 方法

Func<TSource, ParallelLoopState, TLocal, TLocal> body, im

Action<TLocal> localFinally);

 

上面2個聲明的差異在於一個long型輸入參數,這個參數是元素在集合中的index,由CLR傳遞給body函數。

須要注意的是,localInit只是在每一個task/thread開始參與到對集合元素的處理時執行一次,而不是針對每一個集合元素都執行一次,相似的,localFinally只有在task/thread完成全部分配給它的任務以後,才被執行一次。

CLR會爲每一個Thread/Task維護一個thread-local storage,能夠理解爲thread/task在整個執行過程當中的狀態。

當一個thread/task參與到執行中時,localInit中返回的TLocal類型值會被做爲這個狀態的初始值,隨着body的執行,這個狀態值會被改變,而body的返回類型也是TLocal,意味着每一次body執行結束,會把最新的TLocal值返回給CLR,而CLR會把這個值設置到thread/taskthread-local storage上去,從而實現thread/task狀態的更新。

最後,localFinally能夠返回這個狀態值,做爲thread/task完成它所負責的全部處理任務後的最終結果。

 

參考:(http://msdn.microsoft.com/en-us/library/dd783359%28v=vs.110%29.aspx

CLR via C# 4th Edition Ch.27 Parallel's Static For, ForEach, and InvokeMethods.

相關文章
相關標籤/搜索