有一種場景:4個人同時做某項任務,該任務分為3個階段,必須要4個人都完成第一階段後才可以進入第二階段,都完成第二階段後才可以進入第三階段。
此時就需要對多個並行的任務做進度控制。
Threading.Barrier可以完成此任務:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace myTest { class Program { static void Main(string[] args) { //定義一個 barrier物件,有4個參與者,所有成員都完成一個步驟的時候,執行的action是BarrierTest方法 //此處可用lambda表示式定義匿名方法。 Barrier barrier = new Barrier(4, BarrierTest); //增加5個參與者 barrier.AddParticipants(5); //增加1個參與者 barrier.AddParticipant(); //減去一個參與者 barrier.RemoveParticipant(); //減去5個參與者 barrier.RemoveParticipants(5); //Thread.Task 對並行迴圈的支援 Parallel.Invoke(TestMethod(barrier), TestMethod(barrier), TestMethod(barrier), TestMethod(barrier)); Console.ReadLine(); } private static void BarrierTest(Barrier barrier) { Console.WriteLine("{0}個參與者都完成了第{1}階段", barrier.ParticipantCount, barrier.CurrentPhaseNumber); } private static Action TestMethod(Barrier barrier) { Action action = () => { Console.WriteLine("我完成了階段0"); barrier.SignalAndWait(); Console.WriteLine("我完成了階段1"); barrier.SignalAndWait(); Console.WriteLine("我完成了階段2"); barrier.SignalAndWait(); }; return action; } } }
執行結果: