Parallel Programming-使用CancellationTokenSource调度并行运行的Task
生活随笔
收集整理的這篇文章主要介紹了
Parallel Programming-使用CancellationTokenSource调度并行运行的Task
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要介紹使用CancellationTokenSource調度并行運行的Task。
一、使用場景
有多個Task并行運行時,如果其中一個Task所運行的程序出現異常,我們想馬上終止所有待執行的Task。這樣對系統的性能等各個方面都是有好處的。
二、源碼
2.1 被多線程執行的代碼
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調度代碼
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產生,會Attach到父Task上,由父Task統一調度(parentTask.Start; parentTask.Wait)
2.3 Task.ContinueWith
foreach (var task in childTasks) {task.ContinueWith(t => cts.Cancel(), TaskContinuationOptions.OnlyOnFaulted); }這塊代碼的主要含義是當task發生錯誤,比如拋出異常的時候,對cts發起取消。這樣cts處于取消狀態后(IsCancellationRequested==true),后續的操作都會直接return,不再執行。
這就回到了本文開始的話題:有多個Task并行運行時,如果其中一個Task所運行的程序出現異常,我們想馬上終止所有待執行的Task。這樣對系統的性能等各個方面都是有好處的。
并行編程打算寫一個系列的文章好好總結一下。
轉載于:https://www.cnblogs.com/Brake/p/Parallel_Programming_Coodinate_Multi_Task_By_CancellationTokenSource.html
總結
以上是生活随笔為你收集整理的Parallel Programming-使用CancellationTokenSource调度并行运行的Task的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生排序题
- 下一篇: 用cookie实现localstorag