·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> [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(); }
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)); }
代码效果
另外一种代码实现
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)); } } }同样的实现效果