当需要【一组任务】并行地运行一连串的阶段,但是每一个阶段都要等待所有他任务完成前一阶段之后才能开始,可以通过Barrier实例来同步这一类协同工作。
Barrier初始化后,将等待特定数量的信号到来,这个数量在Barrier初始化时指定,在所指定的信号个数已经到来后,Barrier将执行一个指定的动作,这个动作也是在Barrier初始化时指定。Barrier在执行动作过后,将会重置,这时又将等待特定数量的信号到来,再执行指定动作。信号通过成员函数SignalAndWait()来发送,执行SignalAndWait()函数的Task或者线程将会投入等待,Barrier将等待特定数量的信号到达,然后Barrier执行完指定动作后被重置,这时SignalAndWait()函数所在的Task或者线程将继续运行。在程序的运行过程中,可以通过成员函数AddParticipant()和RemoveParticpant()来增加或者减少需要等待的信号数量

 public static void Phase1(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase1");
}
public static void Phase2(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase2");
}
public static void Phase3(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase3");
}
public static void Phase4(int taskId)
{
Console.WriteLine($"Task[{taskId}] complete phase4");
}
static void Main(string[] args)
{
Barrier barrier = new Barrier();
int taskId = ;
for (int i = ; i < ; i++)
{
Task.Factory.StartNew(() =>
{
int cur = Interlocked.Increment(ref taskId);
Phase1(cur);
barrier.SignalAndWait();
Phase2(cur);
barrier.SignalAndWait();
Phase3(cur);
barrier.SignalAndWait();
Phase4(cur);
barrier.SignalAndWait();
});
}
Console.ReadKey();
}

Barrier示例

任务执行流程如下:

[.net 多线程]Barrier-LMLPHP

执行结果:

[.net 多线程]Barrier-LMLPHP

Task1/Task2/Task3在phase1都执行完后,才会接着执行phase2

Barrier代码实现分析:https://www.cnblogs.com/majiang/p/7898027.html

05-11 13:13