我刚开始学习一个Barrier如何在udemy的教程和程序多线程中用于线程化茶的思想。我的程序中有多个barrier.SignalAndWait()
,我很困惑它是如何工作的?根据我的理解,程序在看到SignalAndWait
时等待,它会激活已完成的阶段。我猜从那里,这行是打印Console.WriteLine("Phase " + b.CurrentPhaseNumber + " is finished");
。这是对的还是有更多的呢?Barrier SignalAndWait()如何在这种情况下工作?
static Barrier barrier = new Barrier(2, b=> {
Console.WriteLine("Phase " + b.CurrentPhaseNumber + " is finished");
});
public static void Water()
{
Console.WriteLine("Putting the kettle on (takes a bit longer)");
Thread.Sleep(2000);
barrier.SignalAndWait();
Console.WriteLine("Pouring water into cup.");
barrier.SignalAndWait();
Console.WriteLine("Putting the kettle away");
}
public static void Cup()
{
Console.WriteLine("Finding the nicest cup of tea (fast)");
barrier.SignalAndWait();
Console.WriteLine("Adding tea.");
barrier.SignalAndWait();
Console.WriteLine("Adding a sugar");
}
static void Main(string[] args)
{
var water = Task.Factory.StartNew(Water);
var cup = Task.Factory.StartNew(Cup);
var tea = Task.Factory.ContinueWhenAll(new[] { water, cup }, tasks =>
{
Console.WriteLine("Enjoy your cup of tea");
});
tea.Wait();
Console.WriteLine("Main program done");
Console.ReadKey();
}