新浦京81707con > 注册购买 > 多线程之Parallel类

原标题:多线程之Parallel类

浏览次数:129 时间:2019-05-22

  Parallel类是对线程的一个虚幻。该类位于System.Threading.Tasks名称空间中,提供了多少和职责并行性。

二十多线程之Parallel类,四线程parallel

  Parallel类是对线程的二个华而不实。该类位于System.Threading.Tasks名称空间中,提供了数额和职责并行性。

  Paraller类定义了数额交互地For和ForEach的静态方法,以及义务并行的Invoke的静态方法。Parallel.For()和Parallel.ForEach()方法在历次迭代中调用同样的代码,Paraller.Invoke()允许调用不相同的章程。

1.Parallel.For

  Parallel.For()方法类似C#语法的for循环语句,多次实践三个任务。但该办法并行运营迭代,迭代的次第未有定义。

  Parallel.For()方法中,前多少个参数定义了循环的先导和得了,第多少个参数是1个Action委托。Parallel.For方法再次来到类型是ParallelLoopResult结构,它提供了巡回是或不是终止的音信。
  Parallel.For有多个重载版本和四个泛型重载版本。
  示例:

     static void ForTest()
        {
            ParallelLoopResult plr =
                Parallel.For(0,10,i => {
                    Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(5000);
                });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");

        }

  输出:
  新萄京娱乐场手机版 1

  任务不自然映射到1个线程上。线程也足以被差异的职务重用。

  下面的事例,使用了.NET 4.5中新扩大的Thread.Sleep方法,而不是Task.Delay方法。Task.Delay是叁个异步(
  示例:

  static void ForTestDelay()
        {
            ParallelLoopResult plr =
                Parallel.For(0, 10,async i => {
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    await Task.Delay(1000);
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");

            Console.ReadKey();

        }

新萄京娱乐场手机版 ,   输出:
  新萄京娱乐场手机版 2

  下面代码应用了await关键字展开延期,输出结果突显延迟内外的代码运转在不相同的线程中。而且延迟后的任务不再存在,只留下线程,这里还重用了近日的线程。另一个要害的上面是,Parallel类的For方法并不曾等待延迟,而是一贯到位。parallel类只等待它创立的任务,而不等待别的后台活动。所以地方代码应用了Console.ReadKey();使主线程向来运营,不然很恐怕看不到前面包车型大巴出口。

二.提前截止Parallel.For

  For()方法的二个重载版本接受第多个Action<int,ParallelLoopState>委托项目标参数。使用那些格局能够调用ParallelLoopState的Break()或Stop()方法,以甘休循环。
  注意,前面聊起,迭代的逐壹是从未有过概念的。
  示例:

static void ForStop()
        {
            ParallelLoopResult plr =
                Parallel.For(0,10,(int i,ParallelLoopState pls)=> {
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    if (i > 5)
                        pls.Break();
                });

            Console.WriteLine("is completed:{0}",plr.IsCompleted);
            Console.WriteLine("最低停止索引:{0}",plr.LowestBreakIteration);
        }

  输出:
  新萄京娱乐场手机版 3
  迭代值在凌驾5时中断,但其他已初步的任务同时实施。

3.对Parallel.For中的每一种线程先河化

  Parallel.For方法运用五个线程来实行循环,假设供给对各种线程进行伊始化,就足以应用Parallel.For<TLocal>()方法。除了from和to对应的值之外,Parallel.For方法的泛型版本还接受三个委托参数:

    第3个委托参数的类型是Func<TLocal>,这一个方法仅对用于实施迭代的各样线程调用每贰次。
    首个委托参数为循环体定义了寄托。该参数类型是Func<int, ParallelLoopState, TLocal, TLocal>。在那之中第三个参数是循环迭代,首个参数ParallelLoopState允许甘休循环,第10个参数接受从上面参数委托  Func<TLocal>重回的值,该信托还需重返二个TLocal类型的值。该情势对每趟迭代调用。

    第7个委托参数钦赐三个委托Action<TLocal>,接受第一个委托参数的重返值。这么些办法仅对用于实行迭代的每种线程调用每三回。

  示例:

      static void ForInit()
            {
                ParallelLoopResult plr =
                    Parallel.For(0,10,()=> {
                        Console.WriteLine("init thread:{0},task:{1}",Thread.CurrentThread.ManagedThreadId,Task.CurrentId);
                        return Thread.CurrentThread.ManagedThreadId.ToString();
                    },
                    (i, pls,strInit)=> {
                        Console.WriteLine("body:{0},strInit:{1},thraed:{2},task:{3}",i,strInit,Thread.CurrentThread.ManagedThreadId,Task.CurrentId);
                        return i.ToString();
                    },
                    (strI)=> {
                        Console.WriteLine("finally {0}",strI);
                    });
            }

  输出:
  新萄京娱乐场手机版 4

4.Parallel.ForEach

  Parallel.ForEach方法遍历完毕了IEnumerable的成团,类似于foreach,但以异步方式遍历。未有显明遍历顺序。

  示例:

    static void ForeachTest()
        {
            string[] data = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve" };
            ParallelLoopResult plr =  Parallel.ForEach<string>(data, s =>
            {
                Console.WriteLine(s);
            });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");
        }

 

 

  假若要求暂停,能够运用ForEach的重载版本和参数ParallelLoopState。
  访问索引器:

    ParallelLoopResult plr1 = Parallel.ForEach<string>(data, (s,pls,l) =>
            {
                Console.WriteLine("data:{0},index:{1}",s,l);
            });

 

5.Parallel.Invoke

  假若多少个职务并行运转,能够利用Parallel.Invoke方法。该情势允许传递2个Action委托数组。

    static void ParallerInvoke()
        {
            Action[] funs = { Fun1,Fun2};

            Parallel.Invoke(funs);
        }

        static void Fun1()
        {
            Console.WriteLine("f1");
            Console.WriteLine("task:{0},thread:{1}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        }
        static void Fun2()
        {
            Console.WriteLine("f2");
            Console.WriteLine("task:{0},thread:{1}", Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
        }

 

Parallel类是对线程的贰个华而不实。该类位于System.Threading.Tasks名称空间中,提供了多少和职责并行性。 Parall...

  Paraller类定义了数额交互地For和ForEach的静态方法,以及职分并行的Invoke的静态方法。Parallel.For()和Parallel.ForEach()方法在每便迭代中调用一样的代码,Paraller.Invoke()允许调用区别的方法。

1.Parallel.For

  Parallel.For()方法类似C#语法的for循环语句,多次推行2个职分。但该措施并行运转迭代,迭代的种种未有概念。

  Parallel.For()方法中,前多个参数定义了巡回的初阶和终结,第4个参数是3个Action委托。Parallel.For方法重返类型是ParallelLoopResult结构,它提供了循环是还是不是截至的消息。

  Parallel.For有多少个重载版本和多个泛型重载版本。
  示例:

     static void ForTest()
        {
            ParallelLoopResult plr =
                Parallel.For(0,10,i => {
                    Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
                    Thread.Sleep(5000);
                });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");

        }

  输出:

  新萄京娱乐场手机版 5

  职分不自然映射到一个线程上。线程也得以被分化的职责重用。

  上边的例证,使用了.NET 4.5中新扩大的Thread.Sleep方法,而不是Task.Delay方法。Task.Delay是一个异步(
  示例:

  static void ForTestDelay()
        {
            ParallelLoopResult plr =
                Parallel.For(0, 10,async i => {
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    await Task.Delay(1000);
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                });

            if (plr.IsCompleted)
                Console.WriteLine("completed!");

            Console.ReadKey();

        }

  输出:

  新萄京娱乐场手机版 6

  下面代码应用了await关键字展开延期,输出结果展现延迟内外的代码运营在不一样的线程中。而且延迟后的天职不再存在,只留下线程,这里还重用了最近的线程。另一个第二的方面是,Parallel类的For方法并未等待延迟,而是径直完事。parallel类只等待它创制的职责,而不等待别的后台活动。所以地点代码应用了Console.ReadKey();使主线程一向运行,否则很大概看不到前面包车型大巴出口。

2.提前终止Parallel.For

  For()方法的二个重载版本接受第伍个Action<int,ParallelLoopState>委托项目标参数。使用那些主意能够调用ParallelLoopState的Break()或Stop()方法,以结束循环。

  注意,后边谈到,迭代的次第是不曾定义的。
  示例:

static void ForStop()
        {
            ParallelLoopResult plr =
                Parallel.For(0,10,(int i,ParallelLoopState pls)=> {
                    Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
                    if (i > 5)
                        pls.Break();
                });

            Console.WriteLine("is completed:{0}",plr.IsCompleted);
            Console.WriteLine("最低停止索引:{0}",plr.LowestBreakIteration);
        }

  输出:

  新萄京娱乐场手机版 7

  迭代值在超越5时暂停,但别的已开首的任务同时实行。

本文由新浦京81707con发布于注册购买,转载请注明出处:多线程之Parallel类

关键词: 新浦京81707con

上一篇:小程序出炉,微信小程序专属二维码出炉

下一篇:没有了