class Program
{
//构造大象和冰箱
private static ElephantsAndFridges elephantsAndFridges = new ElephantsAndFridges(); static void Main(string[] args)
{
int taskCnt = ; //此处有3个Task来完成工作(注意多任务与多线程及堆栈数据边界)
//并将每个任务的执行结果返回
Task<PhaseTask>[] tasks = new Task<PhaseTask>[taskCnt]; //使多个任务能够采用并行方式依据某种算法在多个阶段中协同工作
// 参数:
// participantCount:
// 参与线程的数量。
//
// postPhaseAction:
// 每个阶段完成之后执行。 可传递 null ,以指示不执行任何操作
Barrier barrier = new Barrier(taskCnt, (b) =>
{
Console.WriteLine(string.Format("第{0}阶段已完成", b.CurrentPhaseNumber + ));
Console.WriteLine();
});
for (int i = ; i < taskCnt; i++)
{
//使用Task工厂启3个任务
tasks[i] = Task<PhaseTask>.Factory.StartNew((obj) =>
{
int cnt = (int)obj; //一个任务一个冰箱(冰箱具有打开和关闭冰箱门及放大象操作)
Fridge fridge = new Fridge(); //注:此处不能用i,存在执行顺序问题
//例如:还未开始从elephantsAndFridges中拿数据,i的值就已经加1了,此时拿的就是i+1位置,而非i位置的数据
fridge.ElephantName = elephantsAndFridges.elephants.ElementAtOrDefault(cnt).ElephantName;
fridge.FridgeName = elephantsAndFridges.fridges.ElementAtOrDefault(cnt).FridgeName; //第一步
fridge.PhaseTaskResult.FirstResult = fridge.OpenTheDoor();
//用信号通知的参与者已达到屏障和所有其他参与者到达屏障也会等待
barrier.SignalAndWait(); //第二步
fridge.PhaseTaskResult.SecondResult = fridge.EnterTheFridge();
barrier.SignalAndWait(); //第三步
fridge.PhaseTaskResult.ThirdResult = fridge.CloseTheDoor();
barrier.SignalAndWait(); //返回每个步骤得到的结果
return fridge.PhaseTaskResult; }, i);
} //最后ContinueWhenAll,输出每个任务记录的结果,释放Barrier
var continueTask = Task.Factory.ContinueWhenAll(tasks, (t) =>
{
foreach (var item in t)
{
Console.Write(string.Format("任务{0}:", t.ToList().IndexOf(item) + ));
Console.WriteLine(item.Result.FirstResult);
Console.Write(string.Format("任务{0}:", t.ToList().IndexOf(item) + ));
Console.WriteLine(item.Result.SecondResult);
Console.Write(string.Format("任务{0}:", t.ToList().IndexOf(item) + ));
Console.WriteLine(item.Result.ThirdResult);
}
Console.WriteLine();
Console.WriteLine("已将全部大象放入全部冰箱");
barrier.Dispose();
}); Console.ReadLine();
}
} /// <summary>
/// 大象
/// </summary>
public class Elephant
{
public String ElephantName { get; set; }
} /// <summary>
/// 冰箱
/// </summary>
public class Fridge
{
public String FridgeName { get; set; } public String ElephantName { get; set; } public PhaseTask PhaseTaskResult = new PhaseTask(); public String OpenTheDoor()
{
return PhaseTaskResult.FirstResult = PhaseTaskResult.PhaseFirst(ElephantName, FridgeName);
} public String EnterTheFridge()
{
return PhaseTaskResult.SecondResult = PhaseTaskResult.PhaseSecond(ElephantName, FridgeName);
} public String CloseTheDoor()
{
return PhaseTaskResult.ThirdResult = PhaseTaskResult.PhaseThird(ElephantName, FridgeName);
}
} /// <summary>
/// 构造大象和冰箱
/// </summary>
public class ElephantsAndFridges
{
public List<Elephant> elephants; public List<Fridge> fridges; public ElephantsAndFridges()
{
elephants = new List<Elephant>()
{
new Elephant() {ElephantName="大象甲" },
new Elephant() {ElephantName="大象乙" },
new Elephant() {ElephantName="大象丙" }
}; fridges = new List<Fridge>()
{
new Fridge(){ FridgeName="冰箱甲"},
new Fridge(){ FridgeName="冰箱乙"},
new Fridge(){ FridgeName="冰箱丙"}
};
}
} /// <summary>
/// 把大象放入冰箱,共需3步
/// 第一步,打开冰箱门
/// 第二步,把大象放进冰箱
/// 第三步,关闭冰箱门
/// 该类提供三个步骤和每个步骤得到的结果
/// </summary>
public class PhaseTask
{
public String FirstResult { get; set; } public String SecondResult { get; set; } public String ThirdResult { get; set; } public String PhaseFirst(string elephantName, string fridgeName)
{
string str = string.Format("第一步:为{0}打开{1}门", elephantName, fridgeName);
Console.WriteLine(str);
return FirstResult = str;
} public String PhaseSecond(string elephantName, string fridgeName)
{
string str = string.Format("第二步:把{0}放入{1}", elephantName, fridgeName);
Console.WriteLine(str);
return SecondResult = str;
} public String PhaseThird(string elephantName, string fridgeName)
{
string str = string.Format("第三步:为{0}关闭{1}门", elephantName, fridgeName);
Console.WriteLine(str);
return ThirdResult = str;
}
}

使用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. unity3d 嵌入iOS的 In App Purchase 应用程序内购买

    Unity做东西是快,但是有些功能是需要额外开发的,比如 IAP (In App Purchase,应用程序内购买) 还好unity提供了灵活的扩展功能,允许嵌入原生代码来做一些unity未实现的功能 ...

  2. python-Web-flask-路由和视图

    1 路由和视图: 简介: Flask框架包含两个核心:Werkzeug工具箱,Jinja2模板引擎 flask: 提供基本功能,属于轻量级 django: 提供相对完整功能,重量级 搭建虚拟环境 He ...

  3. Unity和Android交互学习

    这段时间学习Unity和Android互调,从基础开始. 网上的教程有很多,浏览了一圈教程,发现目前有两种方式:一种是直接把 .aar文件导入Unity/Plugins/Android文件夹,另一种是 ...

  4. QFramework 使用指南 2020(六):脚本生成(4)小结与补充

    我们花了四篇文章,介绍了 QF 中的脚本生成功能. 实际上 QF 中的脚本生成是有两种的,第一种就是我们现在学习的 ViewController + Bind 模式. 这种模式是为除 UGUI 以外的 ...

  5. Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解

    Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...

  6. 删除Vue中无权限的【node_modules】文件

    npm install rimraf -g rimraf node_modules

  7. 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱

    1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...

  8. 洛谷 题解 UVA1626 【括号序列 Brackets sequence】

    看还没有人发记搜的题解,赶紧来水发一篇 我们定义dp[i][j]为区间i~j内最少添加几个括号才能把这个串变成正规括号序列. 考虑四种情况 i>j不存在这种子串,返回0 i==j子串长度为1无论 ...

  9. [转帖]Intel 上一代 可扩展CPU的简单报价

    8.1万元人间毒物!Intel 28核铂金版Xeon 8180零售上市 http://news.mydrivers.com/1/541/541670.htm 猜你想看:英特尔 CPU处理器 Xeon ...

  10. ubuntu下java的安装与执行

    一.安装java sudo add-apt-repository ppa:linuxuprising/java sudo apt-get update sudo apt-get install ora ...