Task 实现多线程的模板

?

?

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);

时间: 2024-07-31 03:16:04

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

linux pthread多线程编程模板

pthread_create() 创建线程,pthread_join()让线程一直运行下去. 链接时要加上-lpthread选项. pthread_create中, 第三个参数为线程函数,定义如下: void * heartbeat_thread() { ... } 下面是main.c : #include <pthread.h> pthread_t thread[MAX_THREAD_NUM]; pthread_mutex_t cache_mutex; pthread_mutex_t var

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

多线程 多线程在4.0中被简化了很多,仅仅只需要用到System.Threading.Tasks.::.Task类,下面就来详细介绍下Task类的使用. 一.简单使用 开启一个线程,执行循环方法,返回结果.开始线程为Start(),等待线程结束为Wait(). /// <summary> /// Task简单使用 /// </summary> private void Demo1() { int i = 0; Random r = new Random(DateTime.Now.S

多线程协调模板

在多线程进行相互协调是个头疼的事,今天写个多线程协调操作模板,以后只要套用这个模板就好了 public abstract class Order implements Runnable { protected boolean open = true; protected ReentrantLock lock; protected Condition condition; protected static int STATUS = 0; public Order(ReentrantLock loc

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

题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=3572 题意:m台机器.须要做n个任务. 第i个任务.你须要使用机器Pi天,且这个任务要在[Si  ,  Ei]区间内完毕才有效. 对于一个任务,仅仅能由一个机器来完毕.一个机器同一时间仅仅能做一个任务. 当然,一个任务能够分成几段不连续的时间来完毕.问,是否能做完所有任务. 题意非常清晰.也就是推断是否是满流. 对于网络流问题,模板大家都有,关键在于怎样建图(详见资料) 思路:今天问了龙哥,对建图

Python 多进程多线编程模板

一.Python 多进程多线程原理介绍 1. Python 全局解释器锁GIL a) Python的全局解释器锁GIL是互斥锁,能够防止本机多个线程一次执行Python字节码:由于CPython的内存管理在线程级别是不安全的(内存泄露),所以这个全局解释器锁是必须的.每个Python进程只能申请使用一个GIL锁,因此Python的多线程虽然是并发的但不能并行处理.Python的解释器每次只能执行一个线程,待GIL锁释放后再执行下一个线程,这样线程轮流被执行. b) Python2.x里,GIL的

C#中级-常用多线程操作(持续更新)

一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参考了多篇园子里的精彩博文,在文章最后会贴出具体来源,感谢他们的无私奉献. 二.关于线程 (1) 为何使用线程: 可以使用线程将代码同其他代码隔离,提高应用程序的可靠性: 可以使用线程来简化编码: 可以使用线程来实现并发执行. (2) 进程.应用程序域以及线程的关系: 进程(Process)是Wind

C#基础-FileStream实现多线程断点续传

一.前言 网上有许多的多线程断点续传操作,但总是写的很云里雾里,或者写的比较坑长.由于这几个月要负责公司的在线升级项目,所以正好用到 代码如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO; 6 using System.Threading; 7 using System.Threading.Tasks; 8 9 na

Django模板系统(非常详细)(后台数据如何展示在前台)

前面的章节我们看到如何在视图中返回HTML,但是HTML是硬编码在Python代码中的这会导致几个问题:1,显然,任何页面的改动会牵扯到Python代码的改动网站的设计改动会比Python代码改动更频繁,所以如果我们将两者分离开会更方便2,其次,写后台Python代码与设计HTML是不同的工作,更专业的Web开发应该将两者分开页面设计者和HTML/CSS程序员不应该编辑Python代码,他们应该与HTML打交道3,程序员写Python代码同时页面设计者写HTML模板会更高效,而不是一个人等待另一

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这些是多线程的基本原理. .NET 4.0以后对多线程的实现变得更简单了. 本节主要讨论.NET4.0多线程的新特性——使用Task类创建多线程. 读前必备: A. LINQ使用  [.net 面向对象编程基础] (20) LINQ使用 B. 泛型          [.net 面向对象编程基础] (