1. class Program
  2. {
  3. //构造大象和冰箱
  4. private static ElephantsAndFridges elephantsAndFridges = new ElephantsAndFridges();
  5.  
  6. static void Main(string[] args)
  7. {
  8. int taskCnt = ;
  9.  
  10. //此处有3个Task来完成工作(注意多任务与多线程及堆栈数据边界)
  11. //并将每个任务的执行结果返回
  12. Task<PhaseTask>[] tasks = new Task<PhaseTask>[taskCnt];
  13.  
  14. //使多个任务能够采用并行方式依据某种算法在多个阶段中协同工作
  15. // 参数:
  16. // participantCount:
  17. // 参与线程的数量。
  18. //
  19. // postPhaseAction:
  20. // 每个阶段完成之后执行。 可传递 null ,以指示不执行任何操作
  21. Barrier barrier = new Barrier(taskCnt, (b) =>
  22. {
  23. Console.WriteLine(string.Format("第{0}阶段已完成", b.CurrentPhaseNumber + ));
  24. Console.WriteLine();
  25. });
  26. for (int i = ; i < taskCnt; i++)
  27. {
  28. //使用Task工厂启3个任务
  29. tasks[i] = Task<PhaseTask>.Factory.StartNew((obj) =>
  30. {
  31. int cnt = (int)obj;
  32.  
  33. //一个任务一个冰箱(冰箱具有打开和关闭冰箱门及放大象操作)
  34. Fridge fridge = new Fridge();
  35.  
  36. //注:此处不能用i,存在执行顺序问题
  37. //例如:还未开始从elephantsAndFridges中拿数据,i的值就已经加1了,此时拿的就是i+1位置,而非i位置的数据
  38. fridge.ElephantName = elephantsAndFridges.elephants.ElementAtOrDefault(cnt).ElephantName;
  39. fridge.FridgeName = elephantsAndFridges.fridges.ElementAtOrDefault(cnt).FridgeName;
  40.  
  41. //第一步
  42. fridge.PhaseTaskResult.FirstResult = fridge.OpenTheDoor();
  43. //用信号通知的参与者已达到屏障和所有其他参与者到达屏障也会等待
  44. barrier.SignalAndWait();
  45.  
  46. //第二步
  47. fridge.PhaseTaskResult.SecondResult = fridge.EnterTheFridge();
  48. barrier.SignalAndWait();
  49.  
  50. //第三步
  51. fridge.PhaseTaskResult.ThirdResult = fridge.CloseTheDoor();
  52. barrier.SignalAndWait();
  53.  
  54. //返回每个步骤得到的结果
  55. return fridge.PhaseTaskResult;
  56.  
  57. }, i);
  58. }
  59.  
  60. //最后ContinueWhenAll,输出每个任务记录的结果,释放Barrier
  61. var continueTask = Task.Factory.ContinueWhenAll(tasks, (t) =>
  62. {
  63. foreach (var item in t)
  64. {
  65. Console.Write(string.Format("任务{0}:", t.ToList().IndexOf(item) + ));
  66. Console.WriteLine(item.Result.FirstResult);
  67. Console.Write(string.Format("任务{0}:", t.ToList().IndexOf(item) + ));
  68. Console.WriteLine(item.Result.SecondResult);
  69. Console.Write(string.Format("任务{0}:", t.ToList().IndexOf(item) + ));
  70. Console.WriteLine(item.Result.ThirdResult);
  71. }
  72. Console.WriteLine();
  73. Console.WriteLine("已将全部大象放入全部冰箱");
  74. barrier.Dispose();
  75. });
  76.  
  77. Console.ReadLine();
  78. }
  79. }
  80.  
  81. /// <summary>
  82. /// 大象
  83. /// </summary>
  84. public class Elephant
  85. {
  86. public String ElephantName { get; set; }
  87. }
  88.  
  89. /// <summary>
  90. /// 冰箱
  91. /// </summary>
  92. public class Fridge
  93. {
  94. public String FridgeName { get; set; }
  95.  
  96. public String ElephantName { get; set; }
  97.  
  98. public PhaseTask PhaseTaskResult = new PhaseTask();
  99.  
  100. public String OpenTheDoor()
  101. {
  102. return PhaseTaskResult.FirstResult = PhaseTaskResult.PhaseFirst(ElephantName, FridgeName);
  103. }
  104.  
  105. public String EnterTheFridge()
  106. {
  107. return PhaseTaskResult.SecondResult = PhaseTaskResult.PhaseSecond(ElephantName, FridgeName);
  108. }
  109.  
  110. public String CloseTheDoor()
  111. {
  112. return PhaseTaskResult.ThirdResult = PhaseTaskResult.PhaseThird(ElephantName, FridgeName);
  113. }
  114. }
  115.  
  116. /// <summary>
  117. /// 构造大象和冰箱
  118. /// </summary>
  119. public class ElephantsAndFridges
  120. {
  121. public List<Elephant> elephants;
  122.  
  123. public List<Fridge> fridges;
  124.  
  125. public ElephantsAndFridges()
  126. {
  127. elephants = new List<Elephant>()
  128. {
  129. new Elephant() {ElephantName="大象甲" },
  130. new Elephant() {ElephantName="大象乙" },
  131. new Elephant() {ElephantName="大象丙" }
  132. };
  133.  
  134. fridges = new List<Fridge>()
  135. {
  136. new Fridge(){ FridgeName="冰箱甲"},
  137. new Fridge(){ FridgeName="冰箱乙"},
  138. new Fridge(){ FridgeName="冰箱丙"}
  139. };
  140. }
  141. }
  142.  
  143. /// <summary>
  144. /// 把大象放入冰箱,共需3步
  145. /// 第一步,打开冰箱门
  146. /// 第二步,把大象放进冰箱
  147. /// 第三步,关闭冰箱门
  148. /// 该类提供三个步骤和每个步骤得到的结果
  149. /// </summary>
  150. public class PhaseTask
  151. {
  152. public String FirstResult { get; set; }
  153.  
  154. public String SecondResult { get; set; }
  155.  
  156. public String ThirdResult { get; set; }
  157.  
  158. public String PhaseFirst(string elephantName, string fridgeName)
  159. {
  160. string str = string.Format("第一步:为{0}打开{1}门", elephantName, fridgeName);
  161. Console.WriteLine(str);
  162. return FirstResult = str;
  163. }
  164.  
  165. public String PhaseSecond(string elephantName, string fridgeName)
  166. {
  167. string str = string.Format("第二步:把{0}放入{1}", elephantName, fridgeName);
  168. Console.WriteLine(str);
  169. return SecondResult = str;
  170. }
  171.  
  172. public String PhaseThird(string elephantName, string fridgeName)
  173. {
  174. string str = string.Format("第三步:为{0}关闭{1}门", elephantName, fridgeName);
  175. Console.WriteLine(str);
  176. return ThirdResult = str;
  177. }
  178. }

使用Barrier分三步将大象放入冰箱的更多相关文章

  1. Postman A请求的返回值作为B请求的入参( 拢共分三步)

  2. java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊

    java 调用 C# 类库搞定,三步即可,可以调用任何类及方法,很简单,非常爽啊 java 调用 C# 类库搞定,可以调用任何类及方法,很简单,非常爽啊 总体分三步走: 一.准备一个 C# 类库 (d ...

  3. [其它]iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步

    iOS 12.2支持电信VoLTE了,中国电信教你如何开通:只要三步 link :https://baijiahao.baidu.com/s?id=1629039609897267682&wf ...

  4. 把大象装进冰箱的N种方法

    作者:折剑头链接:https://www.zhihu.com/question/49214119/answer/115728034来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  5. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

  6. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  7. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  8. java入门第三步之数据库连接

    数据库连接可以说是学习web最基础的部分,也是非常重要的一部分,今天我们就来介绍下数据库的连接为下面学习真正的web打下基础 java中连接数据库一般有两种方式: 1.ODBC——Open Datab ...

  9. [转]Membership三步曲之入门篇 - Membership基础示例

    本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例   Members ...

随机推荐

  1. Scala使用备注一

    package com.ws.spark.study.scala import java.io.File import org.scalatest.FlatSpec import scala.io.S ...

  2. Ubuntu Docker-ce安装

    使用官方给的脚本进行安装 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

  3. awk工具的基本用法

    awk文本过滤的基本用法 1)基本操作方法 格式:awk [选项] '[条件]{指令}' 文件 其中,print 是最常用的编辑指令:若有多条编辑指令,可用分号分隔. Awk过滤数据时支持仅打印某一列 ...

  4. Linux系统管理----LVM逻辑卷和磁盘配额作业习题

    1.为主机增加80G SCSI 接口硬盘 2.划分三个各20G的主分区 [root@localhost chen]# fdisk /dev/sdb 命令(输入 m 获取帮助):n Partition ...

  5. 交换分区swap

    一.查看当前的交换分区[root@server0 ~]# free      -mtotal used free shared buff/cache availableMem: 489 140 145 ...

  6. Guava源码阅读-base-CharMatcher

    package com.google.common.base; (部分内容摘自:http://blog.csdn.net/idealemail/article/details/53860439) 之前 ...

  7. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...

  8. RAMSPEED的简单测试数据 x86虚拟机 龙芯 飞腾

    1. ramspeed 简介 http://alasir.com/software/ramspeed/ 官网为 2. 进行简单安装测试的步骤 . 下载 wget http://alasir.com/s ...

  9. Oracle参数文件修改

    初始化参数文件有两种,文本初始化参数文件 pfile 和二进制初始化参数文件 spfile.   动态参数文件spfile 这是Oracle推荐的初始化参数文件类型.这是一个可以写入和读取的二进制文件 ...

  10. A司入职面试宝典

    =公司介绍============================= 世界500强,每股股票2000刀. 面试难度:**** 加班程度:* =面试-流程介绍====================== ...