Barrier  是一个对象,它可以在并行操作中的所有任务都达到相应的关卡之前,阻止各个任务继续执行。 如果并行操作是分阶段执行的,并且每一阶段要求各任务之间进行同步,则可以使用该对象。 ——MSDN

按照我的理解Barrier其实就是将多个任务同步,而同步需要一个屏障或者是关卡,那么其方法SignalAndWait()就是屏障的作用;

我们来模拟现实中例子,做火车就是很好的参照,大家知道,火车的车次有个发车点,到了那个时间点才能发车,那我们稍微修改下,人到齐后才能发车。

1.首先从家出发,在路上实现:

        private static void OnRoading(string name, int costTime)
        {
            Console.WriteLine(string.Format("[{0}]在去火车站路上.....,花费{1}小时.", name, costTime));
            Thread.Sleep(new TimeSpan(0, 0, costTime));
        }

2.达到火车站,等候火车,这相当于同步任务,(所模拟的是,乘火车到人到齐后才能发车)

        private static void OnStationing(string name)
        {
            Console.WriteLine(string.Format("[{0}]到达火车站,正在安检等候火车.....", name));
            gate.SignalAndWait();
        }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

3.人到齐后,发车

        private static void OnTraining(string name)
        {
            Console.WriteLine(string.Format("[{0}]乘坐火车离开.....", name));
        }

完整代码实现

        static Barrier gate;
        static void Main(string[] args)
        {
            try
            {
                ToStationWorkTyp2();
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("Exception Message:{0}", ex.Message.Trim()));
            }
            finally
            {
                Console.ReadLine();
            }
        }
        private static void ToStationWorkTyp2()
        {
            gate = new Barrier(3);
            Task _taskA = Task.Factory.StartNew(() =>
            {
                OnRoading("personA", 2);
                OnStationing("personA");
                OnTraining("personA");
            });

            Task _taskB = Task.Factory.StartNew(() =>
            {
                OnRoading("personB", 5);
                OnStationing("personB");
                OnTraining("personB");
            });

            Task _taskC = Task.Factory.StartNew(() =>
            {
                OnRoading("personC", 3);
                OnStationing("personC");
                OnTraining("personC");
            });
            Task.WaitAll(_taskA, _taskB, _taskC);

        }
        private static void OnTraining(string name)
        {
            Console.WriteLine(string.Format("[{0}]乘坐火车离开.....", name));
        }
        private static void OnStationing(string name)
        {
            Console.WriteLine(string.Format("[{0}]到达火车站,正在安检等候火车.....", name));
            gate.SignalAndWait();
        }
        private static void OnRoading(string name, int costTime)
        {
            Console.WriteLine(string.Format("[{0}]在去火车站路上.....,花费{1}小时.", name, costTime));
            Thread.Sleep(new TimeSpan(0, 0, costTime));
        }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }代码效果

另外一种代码实现

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace PLinq
{
    class Program
    {
        static Barrier gate;
        static void Main(string[] args)
        {
            try
            {
                ToStationWorkTyp1();
            }
            catch (Exception ex)
            {
                Console.WriteLine(string.Format("Exception Message:{0}", ex.Message.Trim()));
            }
            finally
            {
                Console.ReadLine();
            }
        }
        private static void ToStationWorkTyp1()
        {
            gate = new Barrier(3);
            Task _taskA = Task.Factory.StartNew(() => ToStation("PersonA", 2));
            Task _taskB = Task.Factory.StartNew(() => ToStation("PersonB", 3));
            Task _taskC = Task.Factory.StartNew(() => ToStation("PersonC", 5));
            Task.WaitAll(_taskA, _taskB, _taskC);
        }
        private static void ToStation(string name, int costTime)
        {
            Console.WriteLine(string.Format("[{0}]在去火车站路上.....,花费{1}小时.", name, costTime));
            Thread.Sleep(new TimeSpan(0, 0, costTime));
            Console.WriteLine(string.Format("[{0}]到达火车站,正在安检等候火车.....", name));
            gate.SignalAndWait();
            Console.WriteLine(string.Format("[{0}]乘坐火车离开.....", name));
        }
    }
}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }同样的实现效果

[C#]『Barrier』任务并行库使用小计的更多相关文章

  1. [C#]『CountdownEvent』任务并行库使用小计

    System.Threading.CountdownEvent  是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定. CountdownEvent  专门用于以下情况:您必须使用 ...

  2. [C#]『PLINQ』任务并行库使用小计

    并行 LINQ (PLINQ) 是 LINQ to Objects 的并行实现. PLINQ 实现完整的 LINQ 标准查询运算符集作为 T:System.Linq 命名空间的扩展方法,并具有用于并行 ...

  3. [C#]『Task』任务并行库使用小计

    1.简单创建使用 using System; using System.Diagnostics; using System.Threading; using System.Threading.Task ...

  4. C# 任务并行库使用小计 z

    1.简单创建使用 using System; using System.Diagnostics; using System.Threading; using System.Threading.Task ...

  5. 『计算机视觉』imgaug图像增强库中部分API简介

    https://github.com/aleju/imgaug 介绍一下官方demo中用到的几个变换,工程README.md已经给出了API简介,个人觉得不好理解,特此单独记录一下: import n ...

  6. 『TensorFlow』分布式训练_其二_单机多GPU并行&GPU模式设定

    建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...

  7. 『开源』Slithice 2013 服务器集群 设计和源码

    相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...

  8. 『计算机视觉』Mask-RCNN_推断网络其四:FPN和ROIAlign的耦合

    一.模块概述 上节的最后,我们进行了如下操作获取了有限的proposal, # [IMAGES_PER_GPU, num_rois, (y1, x1, y2, x2)] # IMAGES_PER_GP ...

  9. 『计算机视觉』Mask-RCNN

    一.Mask-RCNN流程 Mask R-CNN是一个实例分割(Instance segmentation)算法,通过增加不同的分支,可以完成目标分类.目标检测.语义分割.实例分割.人体姿势识别等多种 ...

随机推荐

  1. 浅谈js单例模式

    单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的 ...

  2. Ubuntu下为 Flash插件方法

    1.下载flash插件,地址:http://get.adobe.com/cn/flashplayer/ 下载tar格式的install_flash_player_11_linux_x86_64.tar ...

  3. Java+7入门经典 -2 数据

    第2章 程序,数据,变量和计算 2.1 数据和变量 变量是一段有名字的内存, 存储程序中的信息, 描述事物的数据项; 每段定义了名字的内存只能存储一种特定类型的数据. Type; 编译器会检测错误的类 ...

  4. Sample Ant Build File - WAR--reference

    I am using the Spring SimpleFormController example to illustrate the build process. The figure below ...

  5. SAXParser 解析器和 XMLEventReader(读取XML文档)

    import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import java ...

  6. java窗体与Flash交互

    最近在研究flash,用flash去读取文件很简单,但是存储文件就很麻烦了. 因此想到用java的窗体进行交互. 下面是DJNativeSwing-SWT-1-0-3-20140708的下载链接: h ...

  7. Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例

    1. 用Reader模拟BufferedReader的readLine()功能:   readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: ...

  8. Velocity 模板引擎介绍

    一.变量 1. 变量定义 #set($name =“velocity”) 2. 变量的使用 在模板文件中使用$name 或者${name} 来使用定义的变量.推荐使用${name} 这种格式,因为在模 ...

  9. Force removing ActivityRecord,app died, no saved state报错的理解

    为什么说理解呢?出现这个问题,我的情景是,在activity里面直接起了一个Thread,线程里面进行了一个繁重的任务,当线程执行完后,这个activity也销毁了,界面显示的任务栈下面的一个活动.百 ...

  10. zigbee

    IEEE802.15.4定义了两种器件:全功能器件(FFD,Full-FunctionDevice),和简化功能器件(RFD,Reduced-functionDevice) 协调器:(coordina ...