写点什么

介绍任务并行库中新增的取消框架

  • 2009-11-15
  • 本文字数:866 字

    阅读完需:约 3 分钟

.NET 4 的任务并行类库在 beta 2 中有了新面貌。这个类库与传统的 ThreadPool 相比提供了更好的性能和功能。其中一个改进便是解决了 ThreadPool 在任务取消方面的不足。众所周知,目前的线程池并不提供一种有效地方式来取消那些已经创建的任务。

任务并行库从一开始便提供了对任务取消的支持,不过 beta 2 版本中从实现和 API 上都引入了重要的改变。新的取消模型引入了 CancellationTokenSource,其中包含一个 CancellationToken 对象。这样一来 Task 对象便不需要 Cancel、AcknowledgeCancellation、IsCancellationRequested、Current、Parent 以及 TaskCreationOptions.RespectParentCancellation 枚举器等成员。与此相对,许多方法已经提供了一个可选的,包含 CancellationToken 作为参数的重载版本。

希望取消一个或多个任务的对象需要持有一个 CancellationTokenSource 对象,而一个响应取消操作的任务也需要持有 CancellationToken,并且有规律地检查它的 IsCancellationRequested 属性。多个任务可以共用同一个 CancellationToken。在得到任务取消的请求之后,每个任务需要抛出 OperationCanceledException。

在过去的 beta 版本中,任务之间自然维护着父 / 子关系。这个关系和它们产生的行为是自然建立的,除非开发人员显式地进行剥离。在 beta 2 中使用相反的做法。父 / 子关系在默认情况下并不会出现,除非开发人员显式地进行确认。

如果你确认了父 / 子任务,那么你同样获得原有的一些特性,如异常传播,父任务等待子任务完成。如果你不这么做,任务就和传统的 ThreadPool 工作项差不多了。

就像大部分没有处理的异常那样,没有得到“关注”的 TPL 异常会让应用程序崩溃。如果要对异常进行“关注”,你必须在调用任务的 Wait 方法时捕获异常,或者在任务被垃圾回收之前检查其 Exception 属性。Beta 2 增加了一个新的选项,即 UnobservedTaskException 事件,这给了开发人员最后得机会来避免异常造成实际的破坏。

你可以在.NET 并行计算博客中了解更多Beta 2 中的改进。

查看英文原文: Introducing the Task Parallel Library’s new Cancellation Framework

2009-11-15 10:481754
用户头像

发布了 157 篇内容, 共 63.0 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

java deep vs shallow copies

shengjk1

Java deep copy shallow cop

一文搞懂 FlinkSQL函数 LAST_VALUE 的原理

shengjk1

flink flink sql flink 源码

寻找被遗忘的勇气(二十三)

Changing Lin

3月日更

Flink 计算 PV UV

shengjk1

flink flink 实战

C语言性能优化:减少相关性依赖,利用指令并行提升性能

1

编程 性能优化 C语言 cpu 100%

AIOT技术大起底:别人开发“软件”,海尔智家开发“生活”

DT极客

人工智能能和人类辩论了;《云网产业发展白皮书》发布

京东科技开发者

人工智能

一文搞懂Flink SQL执行过程

shengjk1

flink flink源码 flink sql flink sql 执行过程

Flink 提交作业运行的各种模式总结

shengjk1

flink flink 执行

Flink 计算 TopN

shengjk1

flink flink 实战 flink topN

LiteOS内核源码分析:位操作模块

华为云开发者联盟

LiteOS 源代码 位操作 bit Huawei LiteOS

【IstioCon 2021】如何在Istio中进行源地址保持?

华为云原生团队

开源 云原生 istio 华为云 服务网格

上帝视角掌管城市动向!智慧园区驱动城市数字化转型

一只数据鲸鱼

物联网 数据可视化 智慧城市 智慧园区

适配器模式在Mybatis中的妙用

Java小咖秀

Java 源码 设计模式 mybatis 开发

带你全面认识CMMI V2.0(三)——实践域

IPD产品研发管理

CMMI

如何在Python中实现Round函数?

华为云开发者联盟

Python 函数 Numpy Round 舍入函数

JVM G1GC的算法与实现

Yano

Java JVM GC G1GC

FlinkSQL 平台

shengjk1

flink flink sql flink sql 平台

开源的 Switch 模拟器——GitHub 热点速览 v.21.12

HelloGitHub

GitHub 开源

图像视频压缩:深度学习,有一套

华为云开发者联盟

深度学习 自编码器 图像压缩 循环神经网络 视频压缩

实践解析丨Rust 内置 trait:PartialEq 和 Eq

华为云开发者联盟

rust hash Trait PartialEq Eq

Java学习笔记——实体类(ENTITY,VO,DTO,BO)

棉花糖

Java

一文搞懂 Flink 中的锁

shengjk1

flink flink 锁

LeetCode题解:126. 单词接龙 II,BFS,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

深入理解ES8的新特性SharedArrayBuffer

程序那些事

JavaScript ecmascript 程序那些事 es8

一文搞懂 FlinkSQL 的 KafkaSource

shengjk1

flink flink源码 flink sql

Veema 寄来的新书

吴威

vmware 容灾 备份 veeam esxi

Python OpenCV 图像处理二值化,取经之旅第 7 天

梦想橡皮擦

3月日更

万众瞩目的EGG Network,备受期待的New-DeFi自治共识论坛在海口闭幕

币圈那点事

区块链

NA公链(Nirvana)NAC公链独步公链江湖

区块链第一资讯

区块链

企业数字化转型,营销技术驱动超级增长!

博文视点Broadview

介绍任务并行库中新增的取消框架_.NET_Jonathan Allen_InfoQ精选文章