本文主要介绍使用CancellationTokenSource调度并行运行的Task。

一、使用场景

有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Task。这样对系统的性能等各个方面都是有好处的。

二、源码

2.1 被多线程执行的代码

   public class Handler
{
public void DoSomething(CancellationTokenSource cts, int index)
{
if (cts.IsCancellationRequested)
{
return;
}
if (index == )
{
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 = ; i < ; 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。这样对系统的性能等各个方面都是有好处的。

并行编程打算写一个系列的文章好好总结一下。

Parallel Programming-使用CancellationTokenSource调度并行运行的Task的更多相关文章

  1. 用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代

    Parallel类是.NET 4中新增的抽象线程类.如果你开发用的是VS2008或更低版本,那么就直接关闭吧,下面两个示例用了匿名委托,如果不知道匿名委托的语法,那么先去简单了解一下,不然很难理解示例 ...

  2. Task Cancellation: Parallel Programming

    http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...

  3. Notes of Principles of Parallel Programming - TODO

    0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...

  4. 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)

    首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...

  5. Samples for Parallel Programming with the .NET Framework

    The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...

  6. kubernetes调度pod运行于master节点上

    应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...

  7. Parallel Programming for FPGAs 学习笔记(1)

    Parallel Programming for FPGAs 学习笔记(1)

  8. 使用Pabot并行运行RF案例

    一.问题引入 在做接口自动化时随着案例增多,特别是流程类案例增多,特别是asp.net的webform类型的项目,再加上数据库校验也比较耗时,导致RF执行案例时间越来越长,就遇到这样一个问题,705个 ...

  9. Parallel Programming AND Asynchronous Programming

    https://blogs.oracle.com/dave/ Java Memory Model...and the pragmatics of itAleksey Shipilevaleksey.s ...

随机推荐

  1. AOP原理及其实现

       AOP 是 Aspect-Oriented programming 的缩写,中文翻译为面向切面编程,它是OOP(Object-Oriented Programing,面向对象编程)的补充和完善. ...

  2. django启动时报错:Apps aren't loaded yet.

    1.解决方法 编辑manage.py文件,在文件顶部引入django模块.

  3. inux c编程:记录锁

    记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加 ...

  4. c语言操作mysql数据库

    c语言操作Mysql数据库,主要就是为了实现对数据库的增.删.改.查等操作,操作之前,得先连接数据库啊,而连接数据库主要有两种方法.一.使用mysql本身提供的API,在mysql的安装目录中可可以看 ...

  5. shell编程2 ---条件判断语句

    shell编程2 一.条件判断语句 1.按照文件类型进行判断 eg:test -e /etc/passwd  或者  [ -e /etc/passwd ]  &&echo yes || ...

  6. MySQL root 密码重置

    安全模式重置法 基本的思路是,以安全模式启动mysql,这样不需要密码可以直接以root身份登录,然后重设密码. 1. 停止 MySQL 服务 [molo.wu@shark mysql (master ...

  7. etcd -> Highly-avaliable key value store for shared configuration and service discovery

    The name "etcd" originated from two ideas, the unix "/etc" folder and "d&qu ...

  8. mysql 的类型转换函数cast的用法

    CAST(expr   AS   type),   CONVERT(expr,type)   ,   CONVERT(expr   USING   transcoding_name) CAST()   ...

  9. github与eclipse结合使用

    github是现在流行的代码托管平台,今天以eclipse为例讲解github的使用,新建项目,提交eclipse项目到github,新建分支,合并分支 1.github上新建项目 记下githug项 ...

  10. matlab函数之imresize()

    B = imresize(A,scale) B = imresize(A,scale) 返回图像 B,它是将 A 的长宽大小缩放 scale 倍之后的图像.输入图像 A 可以是灰度.RGB 或二值图像 ...