国产探花免费观看_亚洲丰满少妇自慰呻吟_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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南陵县| 禹城市| 抚松县| 聂荣县| 平潭县| 云林县| 隆化县| 荆州市| 唐山市| 石城县| 辰溪县| 黑水县| 班戈县| 莱西市| 喀喇| 璧山县| 青川县| 民和| 屯昌县| 积石山| 罗山县| 榆社县| 合山市| 林西县| 万盛区| 乌兰察布市| 萨嘎县| 如东县| 璧山县| 什邡市| 荣成市| 光山县| 确山县| 游戏| 丘北县| 长寿区| 甘谷县| 怀宁县| 宜君县| 苗栗县| 高阳县|