C#多工並行階段控制—— Threading.Barrier

桃子夭夭發表於2015-08-20

有一種場景: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;
        }
    }
}

執行結果:

 

相關文章