I am unsure about the use of the local init function in Parallel.ForEach, as described in the msdn article: http://msdn.microsoft.com/en-us/library/dd997393.aspx
as an extension to @Honza Brestan's answer. The way Parallel foreach splits the work into tasks can also be important, it will group several loop iterations into a single task so in practice localInit()
is called once for every n iterations of the loop and multiple groups can be started simultaneously.
The point of a localInit
and localFinally
is to ensure that a parallel foreach loop can combine results from each itteration into a single result without you needing to specify lock statements in the body
, to do this you must provide an initialisation for the value you want to create (localInit
) then each body
itteration can process the local value, then you provide a method to combine values from each group (localFinally
) in a thread-safe way.
If you don't need localInit for synchronising tasks, you can use lambda methods to reference values from the surrounding context as normal without any problems. See Threading in C# (Parallel.For and Parallel.ForEach) for a more in depth tutorial on using localInit/Finally and scroll down to Optimization with local values, Joseph Albahari is really my goto source for all things threading.