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. java、python、golang等开发语言如何快速生成二维码?

    免费二维码生成途径非常多!比如比较有名的草料二维码,如果只是简单的使用,用它就足够了.但是如果想大规模的生成,那就不太合适了.再者很多工具都没办法在二维码中加入logo(像微信二维码一样). 接下来, ...

  2. 《精通并发与Netty》学习笔记(10 - 详解NIO (一) Channel、Buffer )

    一.Java NIO 概述 Java NIO 由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Bu ...

  3. Hyperledger Fabric 安全基础:身份系统 PKIs

    什么是身份系统 区块链网络中的角色包括对等节点(peer),订购着,客户端应用程序,管理员等等.这些参与者的身份都封装在X.509数字证书中.这些身份信息真的非常重要,因为他们决定了在网络中参与者具体 ...

  4. Mysql的binlog 和InnoDB的redo-log

    来源:https://www.jianshu.com/p/4bcfffb27ed5 mysql日志系统之redo log和bin log Mr林_月生关注 12018.12.02 01:35:06字数 ...

  5. Node async 控制代码执行顺序

    当你有一个集合,你想循环集合,然后对每个集合按照顺序执行相应的方法你可以使用forEachSeries

  6. docker部署zabbix并设置自动发现规则

      docker部署zabbix比源码安装简单一些,特此记录: 机器准备: zabbix-server: 192.168.0.150 homeserver zabbix-agent: 192.168. ...

  7. 【AtCoder】CODE FESTIVAL 2016 qual A

    CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...

  8. Kubernetes---容器的生命周期

    ⒈ ⒉Init容器 介绍: Pod 能够具有一个或多个容器,应用运行在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器. Init容器与普通的容器非常像,除了如下两点: >Ini ...

  9. PHP无限极菜单

    权限表结构 CREATE TABLE `blog_auth` ( `id` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '序号', `pid` ) NOT N ...

  10. 落网数据库简单查询接口 caddy+php7+mongodb

    落网数据库简单查询接口 一个简单的DEMO,使用了caddy + php7 + mongodb 数据库&接口设计 来自 https://github.com/Aedron/Luoo.spide ...