Barrier
使多个任务能够采用并行方式依据某种算法在多个阶段协同工作。
通俗理解:张三、李四和赵五(多个人)都要去乘旅游大巴【多个任务,并行】
乘车过程都为从家里出来,步行至车站【某种算法】
所有人都到达车站,才能开车【协同工作】
通过在一系列阶段间移动来协作完成一组任务,此时该组中的每个任务发信号指出它已经到达指定阶段的 Barrier 并且暗中等待其他任务到达。 相同的 Barrier 可用于多个阶段。
通俗理解:张三、李四和赵五分别进行自己的步行至车站任务,人到车开【多阶段协作完成一组任务】
张三到达车站【到达指定阶段的Barrier,并等待其他任务到达】大喊"我到了"【任务发出信号】
代码实现:
class Program
{
static Barrier sync;
static void Main(string[] args)
{
sync = new Barrier(3);
var ZhangSan = new Thread(() => WalkToStation("张三",3)); ZhangSan.Start();
var LiSi = new Thread(()=>WalkToStation("李四",1)); LiSi.Start();
var ZhaoWu=new Thread(()=>WalkToStation("赵五",2)); ZhaoWu.Start();
ZhangSan.Join();
LiSi.Join();
ZhaoWu.Join();
Console.WriteLine("车开走啦!");
Console.Read();
}
static void WalkToStation(string name,int time)
{
Console.WriteLine("[{0}]走出家门,开始步行{1}公里", name,time);
Thread.Sleep(time*1000);
Console.WriteLine("[{0}]到达车站", name);
sync.SignalAndWait();
Console.WriteLine("[{0}]坐上车了", name);
}
}
取消任务的执行使用Cancellation Token,当调用Cancel时,会触发OperationCanceledException结束任务的执行。
代码实现:
class Program
{
static Barrier sync;
static CancellationToken token;
static void Main(string[] args)
{
var source = new CancellationTokenSource();
token = source.Token;
sync = new Barrier(3);
var ZhangSan = new Thread(() => WalkToStation("张三",1)); ZhangSan.Start();
var LiSi = new Thread(()=>WalkToStation("李四",3)); LiSi.Start();
var ZhaoWu=new Thread(()=>WalkToStation("赵五",2)); ZhaoWu.Start();
source.Cancel();
ZhangSan.Join();
LiSi.Join();
ZhaoWu.Join();
Console.WriteLine("车开走啦!");
Console.Read();
}
static void WalkToStation(string name,int time)
{
try
{
Console.WriteLine("[{0}]走出家门,开始步行{1}公里", name, time);
Thread.Sleep(time * 1000);
Console.WriteLine("[{0}]到达车站", name);
sync.SignalAndWait(token);
Console.WriteLine("[{0}]坐上车了", name);
}
catch(OperationCanceledException)
{
Console.WriteLine("出行取消,各回各家");
}
}
}