国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[C#]『Barrier』任務并行庫使用小計

2019-11-14 16:47:40
字體:
來源:轉載
供稿:網友

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿图什市| 宕昌县| 黑水县| 滦南县| 六盘水市| 界首市| 伽师县| 乌拉特后旗| 辰溪县| 大英县| 桂东县| 南昌市| 德清县| 德庆县| 丹寨县| 乐山市| 客服| 乐陵市| 寿阳县| 通河县| 读书| 施甸县| 闽清县| 遵义市| 阳春市| 桓仁| 新巴尔虎左旗| 上虞市| 洮南市| 绍兴县| 汽车| 大姚县| 绥阳县| 桓台县| 原平市| 工布江达县| 山东| 关岭| 滨州市| 临安市| 茂名市|