2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

使用 Task、Continuation 和 Future 来代替 ThreadPool

  • 2009-02-05
  • 本文字数:1147 字

    阅读完需:约 4 分钟

.NET 4.0 中提供一个新版的线程池(thread pool)。除了性能改善和新的负载均衡功能之外,新的线程池还允许您使用 Task。一个 Task 是一个轻量的工作单元,类似您使用 ThreadPool.QueueUserWorkItem 方法创建的工作项。但是和匿名的工作项不同,Task 对象提供了强大的 API。您可以捕获 Task.StartNew 方法返回的对象,以此来使用这些 API。这个方法和 Thread 类似,接受一个定义了工作内容的委托对象或匿名方法。

与线程对象的完整功能类似,Task 对象释放出一些方法,可以让线程等待任务完成。这些方法是 Wait,WaitAny 和 WaitAll,后两个方法可以接受一系列的任务。您可以选择无限期的等待,或在一段时间之后超时。

等待期间,调用 Wait 方法的线程会被阻塞。如果阻塞并不符合您的要求,您可以使用 Continuation。这里所说的 Continuation 是指安排在一个或多个任务完毕之后执行的操作。您可以提供一个委托,并使用 ContinueWith,ContinueWithAll 或 ContinueWithAny 三个方法来创建这种后置的任务。您可以多次调用这些方法以创建一系列的操作。

Cancellation 是.NET 目前无法良好支持的一个方面。现在没有很好的办法从线程池中删除不需要的任务,而且线程的取消是一件非常危险的事情。在.NET 4.0 中,任务的取消成为了核心功能。如果一个任务还没有开始就被取消,那么它会立即从队列中移除。如果这个任务已经开始了,那么还需要一个操作来配合进行。实际执行任务的委托需要定期检查 IsCancellationRequested 属性,并给出有效的答复。

任务还有另一个以前的.NET 所没有的功能,它支持“父子”关系。这允许一个复杂的任务被分割为几个小部分,但是还是被视为单个逻辑操作。这点为任务取消等操作提供了巨大的便利。当一个父任务被取消时,您可以选择让所有的子任务同时被取消。

Future 是一个异步执行某个方法的任务。在需要得到方法的结果时,Future 对象会检查这个方法是否完成了。方法执行完毕后这个结果会被返回,至于没有执行完毕的情况下就要根据实现来决定了。

例如,读取 Future 对象的 Value 属性会导致线程被阻塞至方法执行完毕。与其他任务相似,您也可以访问 IsCompleted 属性,或者调用 Wait,ContinueWith 和 Cancel 方法。这些新功能使.NET 中的 Future 对象比书本上描述的更加强大,甚至已经不仅仅是一个原来设想的 Future 对象了。正是因为如此,.NET 4.0 的 Future 已经被重新命名为 Task,其中 T 为返回值的类型。

值得一提的是,.NET 中的 Task 并不强制为线程安全的操作。这里没有做过任何保护,例如在一个计算导数的 Future 对象中也可以改变全局变量。这意味着普通锁和对象拥有规则依旧是生效的。不过您可以尽可能地避免这种状况,只需独占地使用不可变对象即可。

查看英文原文: Replacing the ThreadPool with Tasks, Continuations, and Futures

2009-02-05 22:593053
用户头像

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

关注

评论

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

ON1 Photo Keyword AI 2023:AI照片关键词标注工具

Rose

Metes and Bounds Pro for Mac(房地产契约绘图软件)

晨光熹微

从“有”到“优”:iPaaS 赋能企业 API 服务治理建设

谷云科技RestCloud

数据处理 API 集成平台 ipaas api服务治理

Golang基础笔记十一之日期与时间处理

Hunter熊

golang 定时器 时间戳 计时器 time

AI-Compass宝藏资源库:构建最全面的AI学习与实践生态,服务AI全群体

汀丶人工智能

人工智能

网站用户访问分析入门:新手必懂的6个关键指标

ClkLog

开源 数据分析 埋点 用户行为分析 画像

UltraCompare for Mac(mac文本对比工具)

晨光熹微

时序数据库 TDengine 备份全家桶实操解析:命令行 + 可视化一篇看懂

TDengine

tdengine 时序数据库 备份 恢复

HarmonyOS DevEco Studio 小技巧 - 鸿蒙单向数据流

谢道韫

云上AI推理平台全掌握 (3):服务接入与全球调度

阿里云大数据AI技术

人工智能 深度学习 数据处理 推理 数据库 大数据

天谋科技参与起草中国工业互联网研究院《工业数据库规范》,推动时序数据库标准建设

Apache IoTDB

构建烟草行业设备全生命周期数字基座:新一代MIS的战略选择

中烟创新

清空社媒、裁80人!Manus中国闪电撤离:10万内测码变电子废料

测试人

人工智能

DeskFX Plus for mac(音频增强器)

晨光熹微

10大开源MCP神器!让你的AI从菜鸟变超人

测试人

人工智能

分布式系统高可用性设计 - 缓存策略与数据同步机制

量贩潮汐·WholesaleTide

Java spring 缓存 分布式

「智元机器人」“攻入”科创板,30+家“智元链”企业梳理!

机器人头条

特斯拉 人形机器人 具身智能 宇树科技 智元机器人

如果你想做好生产管理,那么这篇MES 攻略你一定不能错过!

积木链小链

智能制造 mes 生产管理

IntelliJ IDEA 2023永久密钥+中文设置教程-Mac/win

Rose

TypeScript枚举类型应用:前后端状态码映射的最简方案

不在线第一只蜗牛

typescript

AWS RDS PostgreSQL可观测性最佳实践

观测云

数据库

智能体浪潮里,豆包的崛起之路

脑极体

AI

InDesign 2025中文完美解锁版 -Mac/win

Rose

XR 黑客松 48 小时极限开发挑战本周开启丨社区来稿

声网

AI产品经理必懂的3个大模型微调指标

阿星AI工作室

AI 大模型 微调 AI产品经理

StarRocks Community Monthly Newsletter (Jun)

StarRocks

数据库 数据湖 存算分离 StarRocks 物化视图

Faiss能解决什么问题?Faiss是什么?

不在线第一只蜗牛

Faiss

万字长文读懂低代码(Low-Code)前世今生、分类、能力、趋势及选型

优秀

低代码 低代码开发 低代码开发平台

告别传统拍摄,京点点AI试衣一键搞定爆款服装主图!

京东零售技术

使用Task、Continuation和Future来代替ThreadPool_.NET_Jonathan Allen_InfoQ精选文章