Barrier中提供了一个回调函数,每个线程调用SignalAndWait方法后该回调函数会被执行。
eg:
static Barrier _barrier = new Barrier(3, b => Console.WriteLine("1"));
在上面我们初始化了一个Barrier,并在构造中设置为将等待的信号数量为3,这就意味着如何想好执行回调函数Console.WriteLine("1")
,则需要在线程中执行三次_barrier.SignalAndWait();
这样才能释放线程并执行回调函数
下面举个例子
static Barrier _barrier = new Barrier(2, b => Console.WriteLine("End of phase {0}", b.CurrentPhaseNumber + 1));
static void PlayMusic(string name ,int seconds)
{
for(int i = 1; i < 3; i++)
{
Console.WriteLine("--------------------");
Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine("{0}线程启动",name);
Thread.Sleep(TimeSpan.FromSeconds(seconds));
Console.WriteLine("{0}线程完成",name);
_barrier.SignalAndWait();
}
}
static void Main(string[] args)
{
var t1 = new Thread(() => PlayMusic("a", 5));
var t2 = new Thread(() => PlayMusic("b", 2));
t1.Start();
t2.Start();
Console.ReadKey();
}
我们直接来看看运行的情况
很明显要想Barrier中的回调函数并释放线程,必须调用两次_barrier.SignalAndWait();
,代码中在a线程调用了一次,b线程调用了一次,Barrier信号量未到达2时将一直处于阻塞状态。
在程序的运行过程中,可以通过成员函数AddParticipant()和RemoveParticpant()来增加或者减少需要等待的信号数量