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 == )
{
cts.Cancel();
}
Console.WriteLine(index);
}
}
两点:
- 判断cts是否已经取消,如果取消则不再执行。
- 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的更多相关文章
- 用Parallel.For()和Parallel.For<TLocal>()方法实现并行运行迭代
Parallel类是.NET 4中新增的抽象线程类.如果你开发用的是VS2008或更低版本,那么就直接关闭吧,下面两个示例用了匿名委托,如果不知道匿名委托的语法,那么先去简单了解一下,不然很难理解示例 ...
- Task Cancellation: Parallel Programming
http://beyondrelational.com/modules/2/blogs/79/posts/11524/task-cancellation-parallel-programming-ii ...
- Notes of Principles of Parallel Programming - TODO
0.1 TopicNotes of Lin C., Snyder L.. Principles of Parallel Programming. Beijing: China Machine Pres ...
- 4.3 Reduction代码(Heterogeneous Parallel Programming class lab)
首先添加上Heterogeneous Parallel Programming class 中 lab: Reduction的代码: myReduction.c // MP Reduction // ...
- Samples for Parallel Programming with the .NET Framework
The .NET Framework 4 includes significant advancements for developers writing parallel and concurren ...
- kubernetes调度pod运行于master节点上
应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...
- Parallel Programming for FPGAs 学习笔记(1)
Parallel Programming for FPGAs 学习笔记(1)
- 使用Pabot并行运行RF案例
一.问题引入 在做接口自动化时随着案例增多,特别是流程类案例增多,特别是asp.net的webform类型的项目,再加上数据库校验也比较耗时,导致RF执行案例时间越来越长,就遇到这样一个问题,705个 ...
- Parallel Programming AND Asynchronous Programming
https://blogs.oracle.com/dave/ Java Memory Model...and the pragmatics of itAleksey Shipilevaleksey.s ...
随机推荐
- AOP原理及其实现
AOP 是 Aspect-Oriented programming 的缩写,中文翻译为面向切面编程,它是OOP(Object-Oriented Programing,面向对象编程)的补充和完善. ...
- django启动时报错:Apps aren't loaded yet.
1.解决方法 编辑manage.py文件,在文件顶部引入django模块.
- inux c编程:记录锁
记录锁的功能:当一个进程正在读或修改文件的某个部分是,它可以阻止其他进程修改同一文件区.对于这个功能阐述我认为有三点要解释的: 记录锁不仅仅可以用来同步不同进程对同一文件的操作,还可以通过对同一文件加 ...
- c语言操作mysql数据库
c语言操作Mysql数据库,主要就是为了实现对数据库的增.删.改.查等操作,操作之前,得先连接数据库啊,而连接数据库主要有两种方法.一.使用mysql本身提供的API,在mysql的安装目录中可可以看 ...
- shell编程2 ---条件判断语句
shell编程2 一.条件判断语句 1.按照文件类型进行判断 eg:test -e /etc/passwd 或者 [ -e /etc/passwd ] &&echo yes || ...
- MySQL root 密码重置
安全模式重置法 基本的思路是,以安全模式启动mysql,这样不需要密码可以直接以root身份登录,然后重设密码. 1. 停止 MySQL 服务 [molo.wu@shark mysql (master ...
- 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 ...
- mysql 的类型转换函数cast的用法
CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name) CAST() ...
- github与eclipse结合使用
github是现在流行的代码托管平台,今天以eclipse为例讲解github的使用,新建项目,提交eclipse项目到github,新建分支,合并分支 1.github上新建项目 记下githug项 ...
- matlab函数之imresize()
B = imresize(A,scale) B = imresize(A,scale) 返回图像 B,它是将 A 的长宽大小缩放 scale 倍之后的图像.输入图像 A 可以是灰度.RGB 或二值图像 ...