程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Parallel Programming-使用CancellationTokenSource調度並行運行的Task,parallelprogramming

Parallel Programming-使用CancellationTokenSource調度並行運行的Task,parallelprogramming

編輯:C#入門知識

Parallel Programming-使用CancellationTokenSource調度並行運行的Task,parallelprogramming


本文主要介紹使用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。這樣對系統的性能等各個方面都是有好處的。

並行編程打算寫一個系列的文章好好總結一下。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved