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. css解决fixed布局不会出现滚动条问题

    需求是页面移动到一定高度时,顶部出现固定的导航栏,并导航栏带滚动条. CSS很好实现,但是导航栏飘浮顶部后,滚动条怎么也不显示,搜了一些资料终于解决了,现做下笔记. <div class=&qu ...

  2. Jmeter综合运用 之 接口测试

    Jmeter用的最多的就是做接口和性能测试了,着实比较好用,今天给大家分享下如何利用Jmeter做接口测试. 在做接口测试之前,我们起码需要了解: 1.接口涉及的业务 2.接口的基本信息:访问地址.传 ...

  3. C++中使用OPENCV对深度学习的特征图进行可视化

    //需要先在运行目录下创建文件夹opencv_layers #include <iostream> #include <unistd.h> #include <openc ...

  4. CMake版本升级

    CMake 是一个可扩展的开源系统,以独立于编译器的方式在操作系统中管理生成过程.与许多跨平台系统不同,CMake 旨在与本机生成环境结合使用.放置在每个源目录中的简单配置文件(称为 CMakeLis ...

  5. 解决mosh: Nothing received from server on UDP port 60001 环境: centos7.1

    主要问题在于有的教程使用iptables命令来开启对应端口, 但是centos7.1中虽然iptables仍然存在, 但是没有默认安装相关服务, 而是使用firewalld来管理防火墙. 所以我开始以 ...

  6. react新特性hook

    一.hook示例.   import React, { useState } from 'react'; function Example() { // 声明一个叫 “count” 的 state 变 ...

  7. Sed命令的使用详细解释

    Sed命令的使用详细解释 一:sed命令的简介 sed是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处 ...

  8. POJ 1015 Jury Compromise (记录路径的背包问题)

    (点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...

  9. python 基础(十七)--hashlib加密模块

    hashlib加密模块 两种方式使用 字符串是中文时需要先编码成utf-8 常用加密算法:md5,sha1(已被破解)等... >>> a= hashlib.md5() >&g ...

  10. java项目上线的流程(将web项目部署到公网)

    本博文来源于网络,原文的地址在本篇博文最下方. 如何将java web项目上线/部署到公网 关于如何将Java Web上线,部署到公网,让全世界的人都可以访问的问题.小编将作出系列化,完整的流程介绍. ...