zoukankan      html  css  js  c++  java
  • Parallel类

    Parallel类是对线程很好的一个抽象。该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性。
    Parallel类定义了并行的for和foreach的静态方法。Parallel类使用多个任务,因此使用多个线程来完成这个作业。
    Parallel.For()和Parallel.Foreach()方法在每次迭代中调用相同的代码,而Parallel.Invoke()方法允许同时调用不同的方法。Parallel.Invoke用于任务并行性,而Parallel.Foreach用于数据并行性。
    下面的例子前面两个参数表示从0到9迭代。第三个参数是一个Action委托。

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

    上面的例子使用Task.Delay(10);可以看到不一样的结果,分析线程和任务是如何执行的

                ParallelLoopResult result = Parallel.For(0,10,async i=> {
                Console.WriteLine("{0},task:{1},thread:{2}",i,Task.CurrentId,Thread.CurrentThread.ManagedThreadId);
                await Task.Delay(10);
    
                Console.WriteLine("{0},task:{1},thread:{2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
            });
    
            Console.WriteLine("is completed:{0}", result.IsCompleted);
    

    在输出中可以看到,调用 Task.Delay(10);后,线程发生了变化。任务不在存在,只留下线程,而且重用了前面的线程,还有一个重要的方面是,Parallel类的For方法并没有等待延迟,而是直接完成。它只等待它创建的任务,而不等待其他后台活动。

    提前停止Parallel.For
    可以提前终止所有迭代,调用ParallelLoopState的Break和Stop方法。如下:

    ParallelLoopResult result = Parallel.For(10, 30, async (int i ,ParallelLoopState pls) => {
    Console.WriteLine("{0},task:{1}", i, Task.CurrentId);
    await Task.Delay(10);
    if (i > 13)
    pls.Break();
    });
    Console.WriteLine("is completed:{0}", result.IsCompleted);
    Console.WriteLine("lowest break iteration:{0}",result.LowestBreakIteration);

    Parallel.ForEach方法遍历是已异步方式遍历,没有确定遍历顺序。此方法的中断也For方法相同。

            string[] data = { "1","2","3","4","5",};
            ParallelLoopResult result = Parallel.ForEach<string>(data, s => { Console.WriteLine(s); });
    

    Parallle.Invoke方法允许传递一个Action委托数组,也就是可以并行调用多个方法。
    static void Main()
    {
    Parallel.Invoke(Foo, Bar);
    }
    static void Foo()
    {
    Console.WriteLine(1);
    }
    static void Bar()
    {
    Console.WriteLine(2);
    }

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/caozhengze/p/10041188.html
Copyright © 2011-2022 走看看