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. 理解Java中的接口

    一.为什么要使用接口 假如有一个需求:要求实现防盗门的功能.门有"开"和"关"的功能,锁有"上锁"和"开锁"的功能. 分 ...

  2. 输入的全角字符转换成半角字符--css、js、ASP.NET

    我们经常需要用户在表单中输入数字,用户不小心使用了全角状态输入数字,但是在程序中全角的数字是不能直接转换为数字的.这种全角数字的错误处理起来就有些麻烦了.对一些没有经验用户来说明明已经输入数字了,怎么 ...

  3. 淘宝(阿里百川)手机客户端开发日记第七篇 Service,Handler和Thread

    现在我们已经已经知道android有Service,Handler和Thread这些内容了,但是我想应该还有很多人对此并不是很清楚他们之间的区别! (1)Service 是运行在后端的程序,不与UI直 ...

  4. [Effective JavaScript 笔记]第39条:不要重用父类的属性名

    假设想给上节讲的场景图库添加收集诊断信息的功能.这对于调试和性能分析很有用. 38条示例续 给每个Actor实例一个唯一的标识数. 添加标识数 function Actor(scene,x,y){ t ...

  5. web api 解决跨域的问题

    web api 总是会遇到跨域的问题,今天我找到了如下方法解决跨域: 1: a:在配置文件中的 加上如下代码 <system.webServer> <httpProtocol> ...

  6. php友好格式化时间

    php格式化时间显示 function toTime($time) {//$time必须为时间戳 $rtime = date("Y-m-d H:i",$time); $htime ...

  7. N-Queens | & N-Queens II

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  8. 使用clssneme改变图片或样式

    <title>使用className改变样式</title> <style type="text/css"> li{ font-size: 12 ...

  9. python中的引用

    作为一个python初学者,今天被一个python列表和词典引用的问题折磨了很久,但其实了解了缘由也很简单,记录在此备忘. 首先背书python中的引用对象问题: 1. python不允许程序员选择采 ...

  10. codeforces A. New Year Candles 解题报告

    题目链接:http://codeforces.com/problemset/problem/379/A 题目意思:给定a支蜡烛(每支蜡烛可以燃烧1小时),可以在燃尽的a支蜡烛中看能组成多少组b支蜡烛, ...