1.Task多线程简单模板

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4.  
  5. namespace Exercises
  6. {
  7.     public
    class GroupInfo
  8.     {
  9.         public
    string GroupId { get; set; }
  10.         public
    string Data { get; set; }
  11.     }
  12.  
  13.     public
    class MutilTaskTemplate
  14.     {
  15.         //执行此方法,可以看到效果
  16.         public
    void Test()
  17.         {
  18.             Run();
  19.         }
  20.  
  21.         public IEnumerable<GroupInfo> GetGroupInfos()
  22.         {
  23.             return
    new List<GroupInfo>() {
  24.                 new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "what!"},
  25.                 new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "hello!"},
  26.                 new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "world!"},
  27.                 new GroupInfo(){ GroupId = Guid.NewGuid().ToString(), Data = "hehe!"}
  28.             };
  29.         }
  30.  
  31.         public
    void Run()
  32.         {
  33.             Console.WriteLine("start!");
  34.  
  35.             var groupInfos = GetGroupInfos();
  36.  
  37.             List<Task> groupInfoTasks = new List<Task>();
  38.             foreach (var groupInfo in groupInfos)
  39.             {
  40.                 var task = new Task((inGroupInfo) =>
  41.                 {
  42.                     ForEveryGroup(inGroupInfo as GroupInfo);
  43.                 }, groupInfo);
  44.  
  45.                 groupInfoTasks.Add(task);
  46.             }
  47.  
  48.             Parallel.ForEach(groupInfoTasks, (t) => { t.Start(); });
  49.             Task.WaitAll(groupInfoTasks.ToArray());
  50.  
  51.             Console.WriteLine("over!");
  52.         }
  53.  
  54.         private
    void ForEveryGroup(GroupInfo groupInfo)
  55.         {
  56.             Console.WriteLine();
  57.             Console.WriteLine(groupInfo.GroupId);
  58.             //use the groupInfo.Data;
  59.             Console.WriteLine(groupInfo.Data);
  60.         }
  61.     }
  62. }

 

 

执行结果:

 

 

2.Task多线程带子线程模板

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. using System.Linq;
  5.  
  6. namespace Exercises
  7. {
  8.     public
    class GroupInfo2
  9.     {
  10.         public
    string GroupId { get; set; }
  11.  
  12.         public List<RealData> Datas { get; set; }
  13.     }
  14.  
  15.     public
    class RealData
  16.     {
  17.         public RealData(string name, int age)
  18.         {
  19.             this.Name = name;
  20.             this.Age = age;
  21.         }
  22.         public
    string Name { get; set; }
  23.         public
    int Age { get; set; }
  24.     }
  25.  
  26.     public
    class MutilTaskWithSubTaskTemplate
  27.     {
  28.         //执行此方法,可以看到效果
  29.         public
    void Test()
  30.         {
  31.             Run();
  32.         }
  33.  
  34.         public IEnumerable<GroupInfo2> GetGroupInfos()
  35.         {
  36.             return
    new List<GroupInfo2>() {
  37.                 new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
  38.                     new RealData("daniu",26),new RealData("daniu2",27),new RealData("daniu3",28)} },
  39.  
  40.                 new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
  41.                     new RealData("pzdn",26),new RealData("pzdn2",27)} },
  42.  
  43.                 new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
  44.                     new RealData("pozi",26),new RealData("pozi2",27),new RealData("pozi3",28)} },
  45.  
  46.                 new GroupInfo2(){ GroupId = Guid.NewGuid().ToString(), Datas = new List<RealData>(){
  47.                     new RealData("douzi",26),new RealData("douzi2",27),new RealData("douzi3",28)} }
  48.             };
  49.         }
  50.  
  51.         public
    void Run()
  52.         {
  53.             Console.WriteLine("start!");
  54.  
  55.             var groupInfos = GetGroupInfos();
  56.  
  57.             int splitNumber = 2; //2条数据一个Task,改变此数值,则可以控制每条子线程的执行数据量
  58.  
  59.             List<Task> groupInfoTasks = new List<Task>();
  60.             foreach (var groupInfo in groupInfos)
  61.             {
  62.                 var task = new Task((inGroupInfo) =>
  63.                 {
  64.                     int remainData = groupInfo.Datas.Count % splitNumber;
  65.                     int splits = groupInfo.Datas.Count / splitNumber + (remainData != 0 ? 1 : 0);
  66.  
  67.                     var tmpGroupInfo = inGroupInfo as GroupInfo2;
  68.  
  69.                     for (int i = 0; i < splits; i++)
  70.                     {
  71.                         bool flag = (i == splits - 1) && remainData != 0;
  72.  
  73.                         //当前分组的子线程
  74.                         var subTask = new Task((inList) =>
  75.                         {
  76.                             ForEveryGroup(groupInfo.GroupId, inList as IEnumerable<RealData>);
  77.                         }, tmpGroupInfo.Datas.Skip(splitNumber * i).Take(flag ? remainData : splitNumber), TaskCreationOptions.AttachedToParent);
  78.  
  79.                         subTask.Start();
  80.                     }
  81.  
  82.                 }, groupInfo);
  83.  
  84.                 groupInfoTasks.Add(task);
  85.             }
  86.  
  87.             Parallel.ForEach(groupInfoTasks, (t) => { t.Start(); });
  88.             try
  89.             {
  90.                 Task.WaitAll(groupInfoTasks.ToArray());
  91.             }
  92.             catch (AggregateException e)  //AggregateException可以捕获运行中出现的错误
  93.             {
  94.                 Console.WriteLine("Caught Exception:" + e.InnerException.Message); //这里显示
  95.             }
  96.  
  97.             Console.WriteLine("over!");
  98.         }
  99.  
  100.         private
    void ForEveryGroup(string groupId, IEnumerable<RealData> realDatas)
  101.         {
  102.             Console.WriteLine(groupId);
  103.             //use the groupInfo.Data;
  104.             Console.WriteLine(realDatas == null);
  105.             foreach (var item in realDatas)
  106.             {
  107.                 Console.WriteLine(item.Name + "-" + item.Age);
  108.             }
  109.         }
  110.     }
  111. }

 

 

执行结果:

 

3.加入超时

可以增加一个等待超时的字段,在Task.WaitAll(groupInfoTasks.ToArray(),timeOut);

Task 实现多线程的模板的更多相关文章

  1. HTML5触屏版多线程渲染模板技术分享

    前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源 ...

  2. C# -- 使用 Task 执行多线程任务

    C# -- 使用 Task 执行多线程任务 1. 使用 Task 执行多线程任务 class Program { static void Main(string[] args) { Task task ...

  3. Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别

    Task C# 多线程和异步模型 TPL模型   Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...

  4. 基于Task的多线程

    /// <summary> /// 基于Task的多线程 /// </summary> public class Tasks { public static void Task ...

  5. 大数据学习day22------spark05------1. 学科最受欢迎老师解法补充 2. 自定义排序 3. spark任务执行过程 4. SparkTask的分类 5. Task的序列化 6. Task的多线程问题

    1. 学科最受欢迎老师解法补充 day21中该案例的解法四还有一个问题,就是当各个老师受欢迎度是一样的时候,其排序规则就处理不了,以下是对其优化的解法 实现方式五 FavoriteTeacher5 p ...

  6. Task+ConcurrentQueue多线程编程

    队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. ConcurrentQueue< ...

  7. Task C# 多线程和异步模型 TPL模型

    Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task TaskCompletionSource 更通用, ...

  8. 【转】【C#】【Thread】【Task】多线程

    多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回 ...

  9. HDU 3572 Task Schedule(ISAP模板&amp;&amp;最大流问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si  , ...

随机推荐

  1. Linux下建立软链接

    实例:ln -s /home/gamestat    /gamestat Linux下的软链接类似于windows下的快捷方式 ln -s a b 中的 a 就是源文件,b是链接文件名,其作用是当进入 ...

  2. Python 常用函数大体分类

    ==================系统库函数================ 字符串函数 举例数学函数 import math val=math.sin(3.14/6) val=math.sin(m ...

  3. MYSQL注入天书之HTTP头部介绍

    Background-5 HTTP头部介绍 在利用抓包工具进行抓包的时候,我们能看到很多的项,下面详细讲解每一项. HTTP头部详解 1. Accept:告诉WEB服务器自己接受什么介质类型,*/* ...

  4. nginx学习(二):初识配置文件

    nginx的配置文件默认在nginx安装目录中的conf子目录中,主配置文件为nginx.conf, root@mgmserver conf]# pwd/usr/local/nginx/conf一.配 ...

  5. Java正则表达式的最简单应用

    String emailRegex = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; Pattern pat = ...

  6. 用Python操纵MySQL

    本例用Python操纵MySQL,从指定文件读取数据,并对数据进行处理,处理之后批量插入MySQL. 贴上代码: # -*- coding: gbk -*- import re import MySQ ...

  7. 36.在字符串中删除特定的字符[Delete source from dest]

    [题目] 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符.例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”. ...

  8. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  9. 将文件放到Android模拟器的SD卡

    1.打开DDMS页面2.打开File Explorer页,如果没有,在Window –> Show View –>File Explorer3.一般就在mnt –> sdcard中4 ...

  10. BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995 题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出inde ...