[C#]『Barrier』任务并行库使用小计
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』任务并行库使用小计的更多相关文章
- [C#]『CountdownEvent』任务并行库使用小计
System.Threading.CountdownEvent 是一个同步基元,它在收到一定次数的信号之后,将会解除对其等待线程的锁定. CountdownEvent 专门用于以下情况:您必须使用 ...
- [C#]『PLINQ』任务并行库使用小计
并行 LINQ (PLINQ) 是 LINQ to Objects 的并行实现. PLINQ 实现完整的 LINQ 标准查询运算符集作为 T:System.Linq 命名空间的扩展方法,并具有用于并行 ...
- [C#]『Task』任务并行库使用小计
1.简单创建使用 using System; using System.Diagnostics; using System.Threading; using System.Threading.Task ...
- C# 任务并行库使用小计 z
1.简单创建使用 using System; using System.Diagnostics; using System.Threading; using System.Threading.Task ...
- 『计算机视觉』imgaug图像增强库中部分API简介
https://github.com/aleju/imgaug 介绍一下官方demo中用到的几个变换,工程README.md已经给出了API简介,个人觉得不好理解,特此单独记录一下: import n ...
- 『TensorFlow』分布式训练_其二_单机多GPU并行&GPU模式设定
建议比对『MXNet』第七弹_多GPU并行程序设计 一.tensorflow GPU设置 GPU指定占用 gpu_options = tf.GPUOptions(per_process_gpu_mem ...
- 『开源』Slithice 2013 服务器集群 设计和源码
相关介绍文章: <『设计』Slithice 分布式架构设计-支持一体式开发,分布式发布> <『集群』001 Slithice 服务器集群 概述> <『集群』002 Sli ...
- 『计算机视觉』Mask-RCNN_推断网络其四:FPN和ROIAlign的耦合
一.模块概述 上节的最后,我们进行了如下操作获取了有限的proposal, # [IMAGES_PER_GPU, num_rois, (y1, x1, y2, x2)] # IMAGES_PER_GP ...
- 『计算机视觉』Mask-RCNN
一.Mask-RCNN流程 Mask R-CNN是一个实例分割(Instance segmentation)算法,通过增加不同的分支,可以完成目标分类.目标检测.语义分割.实例分割.人体姿势识别等多种 ...
随机推荐
- 解决org.apache.subversion.javahl.ClientException: svn: E200007: Runner for 'org.tmatesoft.svn.core.wc2.SvnMerge' command have not been found
最近使用svn的merge功能合并代码,一直出现一个错误: org.apache.subversion.javahl.ClientException: svn: E200007: Runner for ...
- irefox 34的"Manage Search Engine"去哪了
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:irefox 34的"Manage Search Engine"去哪了.
- js与事件处理
1. <a href="javascript:showModalDialog('../TrainingReq/QryTermCourseInfo.aspx?TermCourseID=& ...
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法 .
eclipse下修改项目名导致tomcat内发布名不一致的解决方法 . ------------------------------------------------------- 解决方案: 直接 ...
- PPTP、L2TP、IPSec和SSLVPN的区别
VPN (虚拟专用网)发展至今已经不在是一个单纯的经过加密的访问隧道了,它已经融合了访问控制.传输管理.加密.路由选择.可用性管理等多种功能,并在全球的信息安全体系中发挥着重要的作用.也在网络上,有关 ...
- PHPinstanceof filal这几个关键字的使用
instanceof表示属不属于的意思 eg: class person{} class Student extends person{} $s=new person(); $st=new stude ...
- 移动终端学习一:css3 Media Queries简介
移动终端学习之一 css3 Media Queries简介 1.简介 别人写过的我就不重复了,来个链接:http://www.w3cplus.com/content/css3-media-querie ...
- (转)使用OpenVPN的一些注意事项
原文地址:http://www.365mini.com/page/16.htm 本文介绍的只是OpenVPN连接或使用过程中的一些注意事项,如果你尚未下载安装OpenVPN,你可以点击查看OpenVP ...
- yii中的自定义组件
yii中的自定义组件(组件就是一些自定义的公用类) 1.在项目目录中的protected/components/Xxxx.php 2.在Xxxx.php中定义一个类,类名必须与文件名相同 3.控制器中 ...
- CDOJ-10(栈的应用)
In Galgame We Trust Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Othe ...