当需要【一组任务】并行地运行一连串的阶段,但是每一个阶段都要等待所有他任务完成前一阶段之后才能开始,可以通过Barrier实例来同步这一类协同工作。
Barrier初始化后,将等待特定数量的信号到来,这个数量在Barrier初始化时指定,在所指定的信号个数已经到来后,Barrier将执行一个指定的动作,这个动作也是在Barrier初始化时指定。Barrier在执行动作过后,将会重置,这时又将等待特定数量的信号到来,再执行指定动作。信号通过成员函数SignalAndWait()来发送,执行SignalAndWait()函数的Task或者线程将会投入等待,Barrier将等待特定数量的信号到达,然后Barrier执行完指定动作后被重置,这时SignalAndWait()函数所在的Task或者线程将继续运行。在程序的运行过程中,可以通过成员函数AddParticipant()和RemoveParticpant()来增加或者减少需要等待的信号数量
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public static void Phase1(int taskId) 2 { 3 Console.WriteLine($"Task[{taskId}] complete phase1"); 4 } 5 public static void Phase2(int taskId) 6 { 7 Console.WriteLine($"Task[{taskId}] complete phase2"); 8 } 9 public static void Phase3(int taskId) 10 { 11 Console.WriteLine($"Task[{taskId}] complete phase3"); 12 } 13 public static void Phase4(int taskId) 14 { 15 Console.WriteLine($"Task[{taskId}] complete phase4"); 16 } 17 static void Main(string[] args) 18 { 19 Barrier barrier = new Barrier(3); 20 int taskId = 0; 21 for (int i = 0; i < 3; i++) 22 { 23 Task.Factory.StartNew(() => 24 { 25 int cur = Interlocked.Increment(ref taskId); 26 Phase1(cur); 27 barrier.SignalAndWait(); 28 Phase2(cur); 29 barrier.SignalAndWait(); 30 Phase3(cur); 31 barrier.SignalAndWait(); 32 Phase4(cur); 33 barrier.SignalAndWait(); 34 }); 35 } 36 Console.ReadKey(); 37 }
任务执行流程如下:
执行结果:
Task1/Task2/Task3在phase1都执行完后,才会接着执行phase2
Barrier代码实现分析:https://www.cnblogs.com/majiang/p/7898027.html