写点什么

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

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

关注

评论

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

Go语言入门16—锁

良猿

Go golang 后端 11月月更

【LeetCode】只出现一次的数字Java题解

Albert

算法 LeetCode 11月月更

桌面端运行小程序的简易实操

FinFish

跨端开发 跨端运行 桌面应用 桌面应用开发

让数据流动起来,RocketMQ Connect 技术架构解析

阿里巴巴云原生

阿里云 RocketMQ 云原生

软件测试面试真题 | UI自动化测试如何通过子元素定位父元素?

测试人

软件测试 面试题 自动化测试

技术内幕 | StarRocks 支持 Apache Hudi 原理解析

StarRocks

#数据库

关于DAO社区代币挖矿治理dapp系统开发

开发微hkkf5566

前端培训学习需要哪些知识?

小谷哥

大专参加大数据培训学习要具备哪几方面的知识

小谷哥

AR Engine光照估计能力,让虚拟物体在现实世界更具真实感

HarmonyOS SDK

AR HMS Core

零基础转行Web前端培训机构怎么选

小谷哥

新双机热备软件排名看这里!

行云管家

高可用 双机热备

前端安全问题及防护思路

FinFish

网络安全 安全 安全架构 移动安全 前端安全

如何把 ThinkPHP 5 的项目迁移到阿里云函数计算来应对流量洪峰?

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

使用 C++ 部署深度学习模型快速上手方案

MegEngineBot

c++ 深度学习 开源 MegEngine 模型部署

JavaScript刷LeetCode心得

js2030code

JavaScript LeetCode

Java培训机构应该怎么去学习开发技术

小谷哥

用javascript分类刷leetcode3.动态规划(图文视频讲解)

Geek_07a724

JavaScript LeetCode

干货|分析PostgreSql单表60w数据却占用55g空间

查拉图斯特拉说

数据库 postgresql db 11月月更

params传参与body传参区别

源字节1号

软件开发 前端开发 后端开发 小程序开发

HarmonyOS线上Codelabs系列挑战赛第二期:调用三方库,制作酷炫的视觉效果

HarmonyOS开发者

HarmonyOS

先楫半导体HPM6700系列正式合入OpenHarmony社区主干

极客天地

HarmonyOS 3开启新一轮升级,3年前的nova 6也能更新!

极客天地

DAO社区治理代币投票挖矿系统开发合约定制

开发微hkkf5566

JavaScript刷LeetCode-字符串类解题技巧

Geek_07a724

JavaScript LeetCode

JavaScript刷LeetCode拿offer-栈相关题目

js2030code

JavaScript LeetCode

堡垒机小知识科普-行云管家

行云管家

网络安全 信息安全 堡垒机 等保2.0

TDSQL携手金蝶云·苍穹,发布“国产数据库联合解决方案”

腾讯云数据库

数据库 腾讯云 tdsql 金蝶 腾讯云数据库

沉浸式视听体验:全景声技术是如何实现的?

阿里云CloudImagine

阿里云 音视频 音频

软件测试面试真题 | 测试一个你完全不熟悉的系统,你会怎么办?

测试人

软件测试 面试题 自动化测试 测试开发

你知道IPC二级和IPC三级有什么区别吗?两者对PCB产品的影响又是什么呢?

华秋PCB

PCB ipc PCB设计

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