博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Parallel.ForEach的不解,请高人指点
阅读量:5254 次
发布时间:2019-06-14

本文共 3435 字,大约阅读时间需要 11 分钟。

刚看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 List
list = 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 }

得到效果:

得出的结论也正如我图片上提到的,一些线程得到的数据看上去是数值的累加,其他一些线程驳斥了这一点。还是不太明白,最主要技术不到家,看源码看不懂

 

转载于:https://www.cnblogs.com/sjr10/p/Parallel_ForEach.html

你可能感兴趣的文章
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
Leetcode Balanced Binary Tree
查看>>
Leetcode 92. Reverse Linked List II
查看>>
九.python面向对象(双下方法内置方法)
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
LeetCode(17) - Letter Combinations of a Phone Number
查看>>
Linux查找命令对比(find、locate、whereis、which、type、grep)
查看>>
路由器外接硬盘做nas可行吗?
查看>>
python:从迭代器,到生成器,再到协程的示例代码
查看>>
Java多线程系列——原子类的实现(CAS算法)
查看>>
在Ubuntu下配置Apache多域名服务器
查看>>
多线程《三》进程与线程的区别
查看>>
linux sed命令
查看>>
html标签的嵌套规则
查看>>
[Source] Machine Learning Gathering/Surveys
查看>>