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. change column to bigint

    今天存储数据的时候报错,发现是3435065640超出了常规int的存储长度, RangeError (3435065640 is out of range for ActiveRecord::Typ ...

  2. [BZOJ1061][Noi2008]志愿者招募

    [BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...

  3. 关于delphi PAServer 远程调试DLL文件

    用PAServer调试的话会产生一个默认user-connectionname的文件夹,且这个文件夹不能自定义.因此无法使调试的dll文件生成到host主程序所在的文件夹下而导致无法调试. 变通方法: ...

  4. javascript memoization递归优化

    memoize优化递归 function createRec(callback, cache) { cache = cache || []; var rec = function(n) { (n in ...

  5. BZOJ 2818

    2818:GCD Description 给定整数$N$,求$1\le x,y\le N$且$\gcd{x,y}$为素数的数对$(x,y)$有多少对. Input $N$ Output RT Samp ...

  6. 使用virtualenv搭建独立的Python环境

    virtualenv可以搭建虚拟且独立的python环境,可以使每个项目环境与其他项目独立开来,保持环境的干净,解决包冲突问题. 一.安装virtualenv virtualenv实际上是一个pyth ...

  7. 【Docker】来自官方映像的 6 个 Dockerfile 技巧

    本文将根据我从官方镜像学到的经验,讲解编写Dockerfile的技巧.   1. 选择Debian  官方镜像的大多数Dockerfile,不管是直接还是通过其他镜像,都是基于Debian的.Dock ...

  8. XShell上传下载命令

    参考:https://www.centos.bz/2012/12/xshell-securecrtrz-sz-upload-download/ 上传文件时,执行rz就会弹出文件选择对话框来选择文件.下 ...

  9. cas单点注销失败Error Sending message to url endpoint

    最近在做cas单点登录时,由于是单点登录.必然会涉及到单点注销,然而在做单点注销时由于对cas注销机制不了解加之测试条件所致,所有测试都是在本机下完成(机器性能较低,没用虚拟机):导致折腾了很久.网上 ...

  10. Java for LeetCode 067 Add Binary

    Given two binary strings, return their sum (also a binary string). For example, a = "11" b ...