• 关于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 }

    得到效果:

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

  • 相关阅读:
    Effective Java 第三版——26. 不要使用原始类型
    Effective Java 第三版——25. 将源文件限制为单个顶级类
    Effective Java 第三版——24. 优先考虑静态成员类
    Effective Java 第三版——23. 优先使用类层次而不是标签类
    Effective Java 第三版——22. 接口仅用来定义类型
    Effective Java 第三版——21. 为后代设计接口
    Effective Java 第三版——20. 接口优于抽象类
    Effective Java 第三版——19. 如果使用继承则设计,并文档说明,否则不该使用
    Effective Java 第三版——18. 组合优于继承
    Effective Java 第三版——17. 最小化可变性
  • 原文地址:https://www.cnblogs.com/sjr10/p/Parallel_ForEach.html
Copyright © 2020-2023  润新知