写点什么

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

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

关注

评论

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

专家的直觉和你的直觉

池建强

书摘 直觉

香港上市"失效"、传言申请科创板,聊聊半年亏损52亿的旷视科技 | IPO招股书系列(4)

赵新龙

IPO 旷视科技 上市 招股说明书 科创板

原创 | DDD与分层

编程道与术

媒体的经营 03 | 很显然,媒体卖广告是最没有前途的

邓瑞恒Ryan

创业 媒体 商业模式

说说疫情下的新常态该怎么应对

CD826

疫情 新常态

npm version 使用详解

Leo

大前端 npm 语义化 版本控制

稀缺:我们为什么会陷入贫穷与忙碌

insight

读书笔记

您到底要说什么?

水色

【获奖名单公示】作为一名技术人,我为什么要写作?

InfoQ写作社区官方

程序员 写作 写作平台 热门活动

网站架构方法

Ya

架构 方法论 网站 大型软件

学会打破确定性思维,才能做得更好

松花皮蛋me

高效工作 10X工作法 精益开发

回"疫"录(5):不见面,云拜年

小天同学

疫情 回忆录 现实纪录 纪实

人生一大误区:做到80%就不错了

池建强

个人成长 自我管理

Gary的唠叨(二):先算是非,后算得失

小盖

Gary的唠叨 感悟

这一战,必战,若一去不返,便一去不返

霍太稳@极客邦科技

创业 项目管理 团队建设 InfoQ

网络编程方法

Ya

方法论 网络编程 socket

深度工作

insight

读书笔记

JCJC错别字检测JS接口新增CORS跨域支持

田春峰-JCJC错别字检测

程序员陪娃漫画系列——夜宵

孙苏勇

程序员 生活 陪伴 漫画

3000字长文教你大数据该怎么学!

老蒙

Java 大数据 spark 学习 开源

网站是什么?

insight

网站

夏天将来,愿我们有足够的知识继续前进

Amon Lee

死磕Java并发(5):线程详解,Java开发这么久,这些线程的基础知识你确定都会了?

Seven七哥

Java Java并发 线程

Java并发编程系列——线程的等待与唤醒

孙苏勇

Java Java并发 并发编程 线程

如何高效开会

熊斌

效率 效率工具

我为什么不愿在公众号发文章,却愿在写作平台发

小天同学

微信公众平台 产品 反馈 写作平台

小技巧:ssh -D 让终端访问或下载快一点

肖飞码字

Linux Shell

【奖项公布】致内测用户——亲爱的1号创作者们~

InfoQ写作社区官方

写作平台 1号创作者 奖品 热门活动

媒体的经营 02 | 媒体/内容行业的主要变现方式

邓瑞恒Ryan

创业 投资 商业

怎么写出bug的

三爻

对开发人员有用的定律、理论、原则和模式

松花皮蛋me

Java 设计模式

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