Parallel Programming-使用CancellationTokenSource调度并行运行的Task
本文主要介紹使用CancellationTokenSource調(diào)度并行運行的Task。
一、使用場景
有多個Task并行運行時,如果其中一個Task所運行的程序出現(xiàn)異常,我們想馬上終止所有待執(zhí)行的Task。這樣對系統(tǒng)的性能等各個方面都是有好處的。
二、源碼
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);}}兩點:
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();}}上面的代碼在正常情況下會有100個Task產(chǎn)生,會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); }這塊代碼的主要含義是當task發(fā)生錯誤,比如拋出異常的時候,對cts發(fā)起取消。這樣cts處于取消狀態(tài)后(IsCancellationRequested==true),后續(xù)的操作都會直接return,不再執(zhí)行。
這就回到了本文開始的話題:有多個Task并行運行時,如果其中一個Task所運行的程序出現(xiàn)異常,我們想馬上終止所有待執(zhí)行的Task。這樣對系統(tǒng)的性能等各個方面都是有好處的。
并行編程打算寫一個系列的文章好好總結(jié)一下。
轉(zhuǎn)載于:https://www.cnblogs.com/Brake/p/Parallel_Programming_Coodinate_Multi_Task_By_CancellationTokenSource.html
總結(jié)
以上是生活随笔為你收集整理的Parallel Programming-使用CancellationTokenSource调度并行运行的Task的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生排序题
- 下一篇: 用cookie实现localstorag