[C#]『Barrier』任务并行库使用小计

Barrier  是一个对象,它可以在并行操作中的所有任务都达到相应的关卡之前,阻止各个任务继续执行。 如果并行操作是分阶段执行的,并且每一阶段要求各任务之间进行同步,则可以使用该对象。 ——MSDN

按照我的理解Barrier其实就是将多个任务同步,而同步需要一个屏障或者是关卡,那么其方法SignalAndWait()就是屏障的作用;

我们来模拟现实中例子,做火车就是很好的参照,大家知道,火车的车次有个发车点,到了那个时间点才能发车,那我们稍微修改下,人到齐后才能发车。

1.首先从家出发,在路上实现:

        private static void OnRoading(string name, int costTime)

        {

            Console.WriteLine(string.Format("[{0}]在去火车站路上.....,花费{1}小时.", name, costTime));

            Thread.Sleep(new TimeSpan(0, 0, costTime));

        }

2.达到火车站,等候火车,这相当于同步任务,(所模拟的是,乘火车到人到齐后才能发车)

        private static void OnStationing(string name)

        {

            Console.WriteLine(string.Format("[{0}]到达火车站,正在安检等候火车.....", name));

            gate.SignalAndWait();

        }

3.人到齐后,发车

        private static void OnTraining(string name)

        {

            Console.WriteLine(string.Format("[{0}]乘坐火车离开.....", name));

        }

完整代码实现

        static Barrier gate;

        static void Main(string[] args)

        {

            try

            {

                ToStationWorkTyp2();

            }

            catch (Exception ex)

            {

                Console.WriteLine(string.Format("Exception Message:{0}", ex.Message.Trim()));

            }

            finally

            {

                Console.ReadLine();

            }

        }

        private static void ToStationWorkTyp2()

        {

            gate = new Barrier(3);

            Task _taskA = Task.Factory.StartNew(() =>

            {

                OnRoading("personA", 2);

                OnStationing("personA");

                OnTraining("personA");

            });



            Task _taskB = Task.Factory.StartNew(() =>

            {

                OnRoading("personB", 5);

                OnStationing("personB");

                OnTraining("personB");

            });



            Task _taskC = Task.Factory.StartNew(() =>

            {

                OnRoading("personC", 3);

                OnStationing("personC");

                OnTraining("personC");

            });

            Task.WaitAll(_taskA, _taskB, _taskC);



        }

        private static void OnTraining(string name)

        {

            Console.WriteLine(string.Format("[{0}]乘坐火车离开.....", name));

        }

        private static void OnStationing(string name)

        {

            Console.WriteLine(string.Format("[{0}]到达火车站,正在安检等候火车.....", name));

            gate.SignalAndWait();

        }

        private static void OnRoading(string name, int costTime)

        {

            Console.WriteLine(string.Format("[{0}]在去火车站路上.....,花费{1}小时.", name, costTime));

            Thread.Sleep(new TimeSpan(0, 0, costTime));

        }

代码效果

image

另外一种代码实现

using System;

using System.Collections;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Threading;

using System.Threading.Tasks;



namespace PLinq

{

    class Program

    {

        static Barrier gate;

        static void Main(string[] args)

        {

            try

            {

                ToStationWorkTyp1();

            }

            catch (Exception ex)

            {

                Console.WriteLine(string.Format("Exception Message:{0}", ex.Message.Trim()));

            }

            finally

            {

                Console.ReadLine();

            }

        }

        private static void ToStationWorkTyp1()

        {

            gate = new Barrier(3);

            Task _taskA = Task.Factory.StartNew(() => ToStation("PersonA", 2));

            Task _taskB = Task.Factory.StartNew(() => ToStation("PersonB", 3));

            Task _taskC = Task.Factory.StartNew(() => ToStation("PersonC", 5));

            Task.WaitAll(_taskA, _taskB, _taskC);

        }

        private static void ToStation(string name, int costTime)

        {

            Console.WriteLine(string.Format("[{0}]在去火车站路上.....,花费{1}小时.", name, costTime));

            Thread.Sleep(new TimeSpan(0, 0, costTime));

            Console.WriteLine(string.Format("[{0}]到达火车站,正在安检等候火车.....", name));

            gate.SignalAndWait();

            Console.WriteLine(string.Format("[{0}]乘坐火车离开.....", name));

        }

    }

}
同样的实现效果

image

你可能感兴趣的:(C#)