并行学习小结

并行学习小结,直接上源代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Threading.Tasks;

using System.Threading;

using System.Diagnostics;

using System.Collections.Concurrent;



public partial class test : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        UseParallel();

        UsePLINQ();

    }

    

    /// <summary>

    /// PLINQ的基本方法应用集合

    /// </summary>

    private void UsePLINQ()

    {

        #region 并行集合运算,Environment.ProcessorCount - 1 给一个处理器出来处理其他任务

        ConcurrentDictionary<int, string> cds = new ConcurrentDictionary<int, string>();//并行考虑用的集合

        Parallel.For(0, 3000, i =>

        {

            cds.TryAdd(i, Math.Sqrt(i).ToString());

        });

        var q1 = from c in cds.Values.AsParallel().WithDegreeOfParallelism(Environment.ProcessorCount - 1)

                 select c;//直接获取该集合,Environment.ProcessorCount - 1 给一个处理器出来处理其他任务

        #endregion



        #region 并行常用的运算

        ConcurrentBag<int> bags = new ConcurrentBag<int>();//线程安全的集合

        var list = ParallelEnumerable.Range(0,3000);//生成并行集合

        list.ForAll(i => {

            bags.Add(i);

        });

        Response.Write("bags长度:" + bags.Count+"<br/>");

        Response.Write("list整数和:" + list.Sum() + "<br/>");

        Response.Write("list最大值:" + list.Max() + "<br/>");

        Response.Write("list最小值:" + list.Min() + "<br/>");

        Response.Write("list平均值:" + list.Average() + "<br/>");

        Response.Write("list默认值:" + list.FirstOrDefault() + "<br/>");



        #endregion



        #region 先并行分组,在对每组并行查询统计

        List<Student> list2 = new List<Student>() 

        { 

            new Student() 

            { 

                ID = 1, 

                Name = "jack", 

                Age = 20 

            }, 

            new Student() 

            { 

                ID = 1,

                Name = "mary", 

                Age = 25 

            }, 

            new Student() 

            { 

                ID = 1, 

                Name = "joe", 

                Age = 29 

            }, 

            new Student() 

            { 

                ID = 1, 

                Name = "Aaron", 

                Age = 25 

            }

        };

        var map = list2.AsParallel().ToLookup(i => i.Age,count=>1);//化简统计        

        var reduce = from IGrouping<int, int> singleMap                     

                     in map.AsParallel()                     

                     select new                     

                     {

                         Age = singleMap.Key,

                         Count = singleMap.Count()

                     };

        reduce.ForAll(i =>{

            Response.Write(string.Format("当前Age={0}的人数有:{1}人<br/>", i.Age, i.Count));        

        });

        #endregion



        foreach (var o in q1)

        {

            Response.Write(o + "<br/>");

        }

    }



    /// <summary>

    /// Parallel的基本使用方法集合

    /// </summary>

    private void UseParallel()

    {

        #region 并行查询和并行输出

        List<string> lists = new List<string>();

        for (int i = 0; i < 1000; i++)

        {

            lists.Add(i.ToString());

        }

        var q1 = from p in lists.AsParallel()

                 where Convert.ToInt32(p) > 100

                 select p;// 并行查询

        q1.ForAll<string>(p =>

        {

            Response.Write(p + "<br/>");//并行输出,注意观察输出结果不是有序的

        });

        #endregion



        #region 串行执行任务

        Stopwatch sw = new Stopwatch();

        sw.Start();

        Run1();

        Run2();

        Response.Write("串行执行时间:" + sw.ElapsedMilliseconds + "<br/>");

        #endregion



        #region 并行执行任务

        sw.Restart();

        Parallel.Invoke(Run1, Run2);

        Response.Write("并行执行时间:" + sw.ElapsedMilliseconds + "<br/>");

        #endregion



        #region 并行赋值

        List<int> mylist = new List<int>();

        Parallel.ForEach(Partitioner.Create(0, 5000), i =>

        {

            for (int m = i.Item1; m < i.Item2; m++)

            {

                mylist.Add(m);

            }

        });

        #endregion



        #region 并行 退出循环 Break和Stop

        List<int> mylist2 = new List<int>();

        Parallel.For(0, 5000, (i, state) =>

        {

            if (mylist2.Count == 50)

            {

                state.Break();

                return;

            }

            mylist2.Add(i);

        });

        #endregion



        #region 并行抛出异常处理

        try

        {

            Parallel.Invoke(Run1, Run2, Run3);

        }

        catch (AggregateException ex)

        {

            foreach (var single in ex.InnerExceptions)

            {

                Response.Write(single.Message + "<br/>");

            }

        }

        #endregion

    }



    private void Run1()

    {

        Thread.Sleep(3000);

    }



    private void Run2()

    {

        Thread.Sleep(5000);

    }



    private void Run3()

    {

        Thread.Sleep(1000);

    }



    private void Run4(int ms)

    {

        Thread.Sleep(ms * 100);

    }

}



public class Student { 

    public int ID { get; set; } 

    public string Name { get; set; } 

    public int Age { get; set; } 

    public DateTime CreateTime { get; set; } 

}

 

你可能感兴趣的:(学习)