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. 交叉编译php5,、nginx、squid方法

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 交叉编译php5 软件版本:php-5.4.27 依赖库:zlib,libxml2 交叉编译器:arm-hisi ...

  2. [转]结合轮廓显示,实现完整的框选目标(附Demo代码)

    原地址:http://www.cnblogs.com/88999660/articles/2887078.html 几次看见有人问框选物体的做法,之前斑竹也介绍过,用画的框生成的视椎,用经典图形学的视 ...

  3. 压缩 javascript 和 css

    www.iwangzheng.com 目前我们项目中的 CSS/JS 文件比较多, 由于RAILS 3.0 没有提供asset pipeline功能,所以这样会制约我们的访问速度. 例如:  目前,我 ...

  4. 关于windows程序的学习及思考系列之一

    1.窗口类的注册 a.windows程序中最简单的就是创建一个简单的窗口,而窗口程序的创建是基于窗口类的,窗口类决定了处理窗口消息的过程函数. b.一个窗口类可以用于创建多个窗口,也就是说窗口是窗口类 ...

  5. android 自定义Dialog背景透明及显示位置设置

    先贴一下显示效果图,仅作参考: 代码如下: 1.自定义Dialog public class SelectDialog extends AlertDialog{ public SelectDialog ...

  6. PHP 遍历目录

    $dir = $_SERVER['DOCUMENT_ROOT'].'/test'; //var_dump($dir);exit; function my_scandir($dir) { $files ...

  7. pip 直接安装tar.gz zip文件包 (windows linux mac 可用)

    在不能连接外网的机器上安装python的各种包,解压安装要人工输入多条命令: tar -zxvf Flask-WTF-0.10.0.tar.gz cd Flask-WTF-0.10.0 python ...

  8. 【转】SQL中内连接和外连接

    如表     -------------------------------------------------     table1 | table2 |     ----------------- ...

  9. iOS 使用Storyboard 和 xib时的一些知识

    以前不太使用xib和storyboard进行布局,后来在工作中参与到了一个项目的维护工作,那个项目就是使用stroyboard的,再加上xcode5对stroyboard的大力支持,就在这里对于使用s ...

  10. canvas API ,通俗的canvas基础知识(三)

    全文说到了三角形,圆形等相关图形的画法,不熟悉的同学可以出门右转,先看看前文,接下来继续我们的图形——曲线. 学过数学,或者是比较了解js 的同学都知道贝塞尔曲线,当然,在数学里面,这是一门高深的学问 ...