任意一个线程调用了 _barrier.SignalAndWait() 方法后,会执行一个回调函数来打印出阶段。
1 ///2 /// 实例 Barrier 类 3 /// 4 public static Barrier _barrier = new Barrier(2, b => Console.WriteLine($"第 {b.CurrentPhaseNumber + 1} 阶段结束")); 5 6 ///7 /// 向 Barrier 发送信号 8 /// 9 /// 10 /// 11 /// 12 public static void PlayMusic(string name, string message, int seconds)13 {14 for (int i = 1; i < 3; i++)15 {16 Console.WriteLine("------------------------");17 18 System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));19 Console.WriteLine($"{name} 开始 {message}");20 21 System.Threading.Thread.Sleep(TimeSpan.FromSeconds(seconds));22 Console.WriteLine($"{name} 结束 {message}");23 24 // 回调函数 打印出阶段25 _barrier.SignalAndWait();26 }27 }
每个线程将向 Barrier 发送两次信号,所以会有两个阶段,可以在每个迭代结束前执行一些计算。当最后一个线程调用 SignalAndWait方法时可以在迭代结束时进行交互。
1 ///2 /// 执行 3 /// 4 public static void Implement() 5 { 6 var t1 = new System.Threading.Thread(() => PlayMusic("吉他手", "奏曲", 5)); 7 8 var t2 = new System.Threading.Thread(() => PlayMusic("歌手", "唱他的歌", 2)); 9 10 t1.Start();11 t2.Start();12 }
输出结果: