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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

ParallelProgramming-使用CancellationTokenSource調(diào)度并行運(yùn)行的Task

2019-11-14 13:50:13
字體:
供稿:網(wǎng)友

本文主要介紹使用CancellationTokenSource調(diào)度并行運(yùn)行的Task。

一、使用場(chǎng)景

有多個(gè)Task并行運(yùn)行時(shí),如果其中一個(gè)Task所運(yùn)行的程序出現(xiàn)異常,我們想馬上終止所有待執(zhí)行的Task。這樣對(duì)系統(tǒng)的性能等各個(gè)方面都是有好處的。

二、源碼

2.1 被多線程執(zhí)行的代碼

   public class Handler    {        public void DoSomething(CancellationTokenSource cts, int index)        {            if (cts.IsCancellationRequested)            {                return;            }            if (index == 2)            {                cts.Cancel();            }            Console.WriteLine(index);        }    }

兩點(diǎn):

  1. 判斷cts是否已經(jīng)取消,如果取消則不再執(zhí)行。
  2. index的=2的時(shí)候取消cts。這樣其他在此之后的Task再執(zhí)行進(jìn)來的時(shí)候IsCancellationRequested就是true。不會(huì)再執(zhí)行。

2.2 Task調(diào)度代碼

 public class AppClient    {        public static void Main()        {            var cts = new CancellationTokenSource();            var childTasks = new List<Task>();            var parentTask = new Task(() =>            {                var taskFactory = new TaskFactory(cts.Token, TaskCreationOptions.AttachedToParent,                    TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default);                for (var i = 0; i < 100; i++)                {                    var tempIndex = i;                    var childTask = taskFactory.StartNew(() => new Handler().DoSomething(cts, tempIndex));                    childTasks.Add(childTask);                }                foreach (var task in childTasks)                {                    task.ContinueWith(t => cts.Cancel(), TaskContinuationOptions.OnlyOnFaulted);                }            });            parentTask.Start();            parentTask.Wait();            Console.Read();        }    }

上面的代碼在正常情況下會(huì)有100個(gè)Task產(chǎn)生,會(huì)Attach到父Task上,由父Task統(tǒng)一調(diào)度(parentTask.Start; parentTask.Wait)

2.3 Task.ContinueWith

foreach (var task in childTasks){      task.ContinueWith(t => cts.Cancel(), TaskContinuationOptions.OnlyOnFaulted);}

這塊代碼的主要含義是當(dāng)task發(fā)生錯(cuò)誤,比如拋出異常的時(shí)候,對(duì)cts發(fā)起取消。這樣cts處于取消狀態(tài)后(IsCancellationRequested==true),后續(xù)的操作都會(huì)直接return,不再執(zhí)行。

這就回到了本文開始的話題:有多個(gè)Task并行運(yùn)行時(shí),如果其中一個(gè)Task所運(yùn)行的程序出現(xiàn)異常,我們想馬上終止所有待執(zhí)行的Task。這樣對(duì)系統(tǒng)的性能等各個(gè)方面都是有好處的。

并行編程打算寫一個(gè)系列的文章好好總結(jié)一下。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 工布江达县| 蒙自县| 东兰县| 岳池县| 宝兴县| 三亚市| 富平县| 玉树县| 兴安盟| 丹阳市| 始兴县| 山西省| 文昌市| 宜黄县| 洪湖市| 石棉县| 开封县| 大同市| 奉节县| 友谊县| 民丰县| 舞阳县| 黔江区| 四平市| 喜德县| 武邑县| 青州市| 黎平县| 伊通| 九台市| 福海县| 巩留县| 河北省| 佳木斯市| 永平县| 察隅县| 建阳市| 广汉市| 二手房| 建始县| 红河县|