• 并行学习小结


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

    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; } 
    }
    
  • 相关阅读:
    Java 学习笔记之 线程interrupted方法
    Java 学习笔记之 线程interrupt方法
    定义函数
    调用函数
    pass语句
    循环
    条件语句
    别样赋值
    import语句
    字典方法
  • 原文地址:https://www.cnblogs.com/kinger906/p/3529751.html
Copyright © 2020-2023  润新知