1. The simple example of Parallel's foreach method:
public static int ParallelTestMethod1()
{
int[] testIntAry = { 2, 5, 6, 7, 8, 9 };
int sum = 0;
Parallel.ForEach(testIntAry,
() => { return 0; },
(n, loopState, index1, total) =>
{
Console.WriteLine("Thread={0}, total={1}", Thread.CurrentThread.ManagedThreadId, total);
total += n;
//Console.WriteLine("Thread={0}, n={1}, index={2}, total={3}", Thread.CurrentThread.ManagedThreadId, n, index, total);
Console.WriteLine("Thread={0}, n={1}, total={2}", Thread.CurrentThread.ManagedThreadId, n, total);
return total;
},
total => Interlocked.Add(ref sum, total));
return sum;
}
Result(It is based on machine. Different machine may have different result): 2 + 5 + 6 +7 + 8 +9 = 37
2. Make a tiny change.
public static int ParallelTestMethod1()
{
int[] testIntAry = { 2, 5, 6, 7, 8, 9 };
int sum = 0;
Parallel.ForEach(testIntAry,
() => { return 5; },
(n, loopState, index1, total) =>
{
Console.WriteLine("Thread={0}, total={1}", Thread.CurrentThread.ManagedThreadId, total);
total += n;
//Console.WriteLine("Thread={0}, n={1}, index={2}, total={3}", Thread.CurrentThread.ManagedThreadId, n, index, total);
Console.WriteLine("Thread={0}, n={1}, total={2}", Thread.CurrentThread.ManagedThreadId, n, total);
return total;
},
total => Interlocked.Add(ref sum, total));
return sum;
}
Result:
Why the result is 47?
I can find the asnswer from MSDN.
http://msdn.microsoft.com/en-us/library/dd992683.aspx
3. Make a tiny change again.
public static int ParallelTestMethod1()
{
int[] testIntAry = { 2, 5, 6, 7, 8, 9 };
int sum = 0;
Parallel.ForEach(
testIntAry,
() => { return 5; },
(n, loopState, index, total) =>
{
Console.WriteLine("Thread={0}, total={1}", Thread.CurrentThread.ManagedThreadId, total);
total += n;
Console.WriteLine("Thread={0}, n={1}, index={2}, total={3}", Thread.CurrentThread.ManagedThreadId, n, index, total);
return 10;
},
total => Interlocked.Add(ref sum, total));
return sum;
}
Result:
Why the result is30?
The answer is same as example 2.