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()用于任务并行性;

          

  • 相关阅读:
    DVWA 黑客攻防演练(十)反射型 XSS 攻击 Reflected Cross Site Scripting
    DVWA 黑客攻防演练(九) SQL 盲注 SQL Injection (Blind)
    DVWA 黑客攻防演练(八)SQL 注入 SQL Injection
    DVWA 黑客攻防演练(七)Weak Session IDs
    DVWA 黑客攻防演练(六)不安全的验证码 Insecure CAPTCHA
    DVWA 黑客攻防演练(五)文件上传漏洞 File Upload
    工作流表结构设计
    Visual Studio 2019尝鲜----新建空项目体验
    《使用CSLA 2019:CSLA .NET概述》原版和机译文档下载
    .NET快速开发平台的在线预览
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7842837.html
Copyright © 2011-2022 走看看