关于Parallel.ForEach的不解,请高人指点
刚看CLR VIA C# 关于 Parallel.ForEach讲解,依葫芦画瓢自己写了一个实例,功能实现了 ,但是不明白如何实现,看源码 看的一头雾水,求高人分析,能帮忙写个简单的内部实现过程
废话不多说 直接上代码
//通过for实现运算 private static long GetTotalCount(String[] strs) { long totalCount = 0; for (int i = 0; i < strs.Length; i++) { //假设操作耗时 Thread.Sleep(50); totalCount += strs[i].Length; } return totalCount; }
1 //通过Parallel.ForEach来实现运算 2 private static long GetParallelTotalCount(String[] strs) 3 { 4 long totalCount = 0; 5 Parallel.ForEach<string, long>(strs, () => 0, (str, loopState, index, length) => 6 { 7 //假设操作耗时 8 Thread.Sleep(50); 9 return str.Length + length; 10 }, 11 length => Interlocked.Add(ref totalCount, length)); 12 13 return totalCount; 14 }
调用过程
1 private static void Main(string[] args) 2 { 3 string[] strs = new[] {"3243","544","5445","dfg","dfgd","hghhhg"}; 4 5 List<string> list = new List<string>(); 6 list.AddRange(strs); 7 list.AddRange(strs); 8 list.AddRange(strs); 9 list.AddRange(strs); 10 list.AddRange(strs); 11 list.AddRange(strs); 12 list.AddRange(strs); 13 list.AddRange(strs); 14 list.AddRange(strs); 15 list.AddRange(strs); 16 list.AddRange(strs); 17 list.AddRange(strs); 18 list.AddRange(strs); 19 list.AddRange(strs); 20 list.AddRange(strs); 21 list.AddRange(strs); 22 list.AddRange(strs); 23 list.AddRange(strs); 24 list.AddRange(strs); 25 list.AddRange(strs); 26 27 string[] strTemp = list.ToArray(); 28 29 Console.WriteLine("Parallel Start"); 30 Stopwatch watch = new Stopwatch(); 31 watch.Start(); 32 long totalLength =GetParallelTotalCount(strTemp); 33 watch.Stop(); 34 Console.WriteLine("TotalCount:{0},Time:{1}", totalLength, watch.ElapsedMilliseconds); 35 Console.WriteLine("Parallel End"); 36 Console.WriteLine("For Start"); 37 watch.Restart(); 38 totalLength = GetTotalCount(strTemp); 39 watch.Stop(); 40 Console.WriteLine("TotalCount:{0},Time:{1}", totalLength, watch.ElapsedMilliseconds); 41 Console.WriteLine("For End"); 42 Console.Read(); 43 }
得到效果:
求不吝赐教Parallel.ForEach怎么实现的,代码中 通过Parallel.ForEach来实现运算 中 ,在ForEach终结委托里他是对长度进行了相加,为什么在主体委托中是 return str.Length + length;而不是return length;对立面如何实现不了解
在独木提示下,对代码进行了点修改
1 //通过Parallel.ForEach来实现运算 2 private static long GetParallelTotalCount(String[] strs) 3 { 4 long totalCount = 0; 5 Parallel.ForEach<string, long>(strs, () => 0, (str, loopState, index, length) => 6 { 7 //假设操作耗时 8 Console.WriteLine("ThreadId:{0},CurrentLength;{1},LastLength:{2}", Thread.CurrentThread.ManagedThreadId, str.Length, length); 9 Thread.Sleep(50); 10 return str.Length + length;}, 11 length => Interlocked.Add(ref totalCount, length)); 12 return totalCount; 13 }
得到效果:
得出的结论也正如我图片上提到的,一些线程得到的数据看上去是数值的累加,其他一些线程驳斥了这一点。还是不太明白,最主要技术不到家,看源码看不懂