zoukankan      html  css  js  c++  java
  • C# 并行任务——Parallel类

    一、Parallel类

          Parallel类提供了数据和任务的并行性;

    二、Paraller.For()

          Paraller.For()方法类似于C#的for循环语句,也是多次执行一个任务。使用Paraller.For()方法,可以并行运行迭代,迭代的顺序没有定义。

          在For()方法中,前两个参数是固定的,这两个参数定义了循环的开头和结束。首先描述它的第一个方法For(int,int,Action<int>),前面两个参数代表循环的开头和介绍,第三个参数是个委托,整数参数是循环的迭代次数,该参数被传递给委托引用的方法。Paraller.For()方法的返回类型是ParallelLoopResult结构,它提供了循环是否结束的信息和最低迭代的索引(返回一个表示从中调用 Break 语句的最低迭代的整数)。先写个例子:

    复制代码
                ParallelLoopResult result = Parallel.For(0, 10, i =>
                {
                    Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(10);
                });
    
                Console.WriteLine("是否完成:{0}", result.IsCompleted);
                Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
    复制代码

    输出结果如下:

    可以看到,该委托方法运行了10次,顺序也是不能被保证的。但是最低迭代并没有数据出来,这是因为他是返回调用 Break 语句的最低迭代的整数,在这我们并没有break。如果需要才执行过程中提前中断For()方法,就可以使用ParallelLoopState来实现,For(int,int,Action<int,ParallelLoopState>)。就上面的例子改一下:

    复制代码
                ParallelLoopResult result = Parallel.For(0, 10, (i, state) =>
                {
                    Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(10);
                    if (i > 5)
                        state.Break();
                });
    
                Console.WriteLine("是否完成:{0}", result.IsCompleted);
                Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
    复制代码

    输出结果如下:

    三、Parallel.ForEach()

          Paraller.ForEach()方法遍历实现了IEnumerable的集合,其方法类似于 foreach的语句,但以异步方式遍历,这里也没有确定遍历顺序。首先描述它的第一个方法,Paraller.ForEach<TSource>(IEnumerable<TSource>,Action<TSource>),先看下面的例子;

    复制代码
                string[] data = { "str1", "str2", "str3" };
                ParallelLoopResult result = Parallel.ForEach<string>(data, str =>
                  {
                      Console.WriteLine(str);
                  });
                Console.WriteLine("是否完成:{0}", result.IsCompleted);
                Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
    复制代码

    输出结果如下:

    它也可以像For一样传入迭代次数和ParallelLoopState的,方法是ForEach<TSource>(IEnumerable<TSource> source, Action<TSource, ParallelLoopState, long> body),接着在上面的例子改动

    复制代码
                string[] data = { "str1", "str2", "str3", "str4", "str5" };
                ParallelLoopResult result = Parallel.ForEach<string>(data, (str, state, i) =>
                  {
                      Console.WriteLine("迭代次数:{0},{1}", i, str);
                      if (i > 3)
                          state.Break();
                  });
                Console.WriteLine("是否完成:{0}", result.IsCompleted);
                Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
    复制代码

    输出结果如下:

    四、Parallel.Invoke()

          Parallel.Invoke()方法,它提供了任务并行性模式。Paraller.Invoke()方法允许传递一个Action委托数组,在其中可以指定应运行的方法,看下面的例子

    复制代码
                Parallel.Invoke(() =>
                {
                    Thread.Sleep(100);
                    Console.WriteLine("method1");
                }, () =>
                {
                    Thread.Sleep(10);
                    Console.WriteLine("method2");
                });
    复制代码

    输出结果如下:

    五、结语

          Parallel.For()和Paraller.ForEach()方法在每次迭代中调用相同的代码,而Parallel.Invoke()方法允许同时调用不同的方法。Parallel.ForEach()用于数据并行性,Parallel.Invoke()用于任务并行性;

          

  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7842837.html
Copyright © 2011-2022 走看看