刚看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(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 Listlist = new List (); 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(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 }
得到效果:
得出的结论也正如我图片上提到的,一些线程得到的数据看上去是数值的累加,其他一些线程驳斥了这一点。还是不太明白,最主要技术不到家,看源码看不懂