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);
        }
    }

两点:

  1. 判断cts是否已经取消,如果取消则不再执行。
  2. index的=2的时候取消cts。这样其他在此之后的Task再执行进来的时候IsCancellationRequested就是true。不会再执行。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值