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:593058
用户头像

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

关注

评论

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

长假将至,推荐两个好东西

池建强

算法 视觉笔记

意想不到的收获哦

南辞

二、基于 Dockerfile 构建并运行镜像

悟尘

Docker Kubernetes 容器 k8s Compose

五、Docker 数据持久化存储与性能调优

悟尘

Docker 容器 k8s Compose kubernet

写在开头

杨友峰

Java 期现

Netty 源码解析(三): Netty 的 Future 和 Promise

猿灯塔

我认为“写作平台”还缺少读者

小天同学

产品 反馈 写作平台 建议

一、Docker基础入门及架构介绍

悟尘

Docker Kubernetes 容器 k8s Compose

三、基于 Docker-registry/Nexus3 搭建本地仓库

悟尘

Docker Kubernetes 容器 k8s Compose

H5功能足够强大,为什么还要微信小程序?

顾强

微信小程序 移动应用

附录3、Docker-compose 命令使用指南

悟尘

Docker Docker-compose

附录4、Docker-compose 配置文件编写指南

悟尘

Docker Docker-compose

web集群架构

桥哥技术之路

VSCode-aliyun-oss-paste-image 插件安装使用指南

悟尘

vscode Paste-image

Node.js 必知必会(安装配置、应用实例及同步控制)

悟尘

node.js

Netty 源码解析(二):Netty 的 Channel

猿灯塔

Netty

七、Docker Compose 入门实践

悟尘

Docker Kubernetes 容器 k8s Compose

Hexo-deployer-cos-cdn 插件安装使用指南

悟尘

Hexo COS CDN Hexo-deployer-cos-cdn

为什么说此前的WiFi安全方案都是小弟?

石君

wifi 无线网络 无线网络安全 Wi-Fi安全

Hexo-admonition 插件安装使用指南

悟尘

Hexo Hexo-admonition Admonition

游戏夜读 | 设计师的数据模型

game1night

废掉一个人最好的办法是让他忙到没有时间思考

熊斌

程序员 职场 思考

四、Docker 网络原理、分类及容器互联配置

悟尘

Docker Kubernetes 容器 k8s Compose

附录1、Docker 常用命令及示例

悟尘

Docker 容器

源码分析 Vector 和 ArrayList

张sir

Java 源码 collection

Redis高可用-哨兵模式配置

Geek_0o5u34

redis 高可用 主从配置 redis高可用 redis哨兵模式

使用Typora + PicGo 图床 + jsDelivr CDN实现高效 Markdown 创作

悟尘

Typora PicGo iPic jsDelivr CDN

告诉你一个学习编程的诀窍(建议收藏)

ithuangqing

学习 编程 自学编程

六、基于多阶段构建减小镜像体积降低复杂度

悟尘

Docker Kubernetes 容器 k8s Compose

八、Kubernetes 入门实践

悟尘

Docker Kubernetes 容器 k8s Compose

附录2、Dockerfile 参考及最佳实践

悟尘

Docker Dockerfile

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