写点什么

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

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

关注

评论

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

[Day25]-[二叉树]二叉搜索树中的插入操作

方勇(gopher)

LeetCode 二叉树 数据结构算法

PingCode 完成近亿元人民币C轮融资,打造世界级研发管理与协作平台

爱吃小舅的鱼

Go语言入门很简单:Go 中的作用域和变量隐藏

宇宙之一粟

作用域 Go 语言 4月月更

REDIS集群安装运维调优及常见问题处理

IT巅峰技术

DevSecOps“内置安全保护”,让软件研发“天生健康”

华为云开发者联盟

DevOps DevSecOps 软件研发 安全架构设计 安全隐私

Go单体服务开发最佳实践

万俊峰Kevin

微服务 单体架构 web开发 go-zero Go 语言

求推荐一款免费的项目(OKR)管理系统?

优秀

OKR 项目管理系统

聊聊项目外包

石云升

创业 项目管理 职场经验 4月月更 项目外包

linux之service命令

入门小站

Windows 11 修改 PIN 的长度为 4 位

HoneyMoose

Android C++系列:string最佳实践

轻口味

c++ android 4月月更

Swoole中的协程使用相关说明,快来围观

CRMEB

低代码在线文档 — VitePress网站生成

源字节1号

软件开发

超干货 | 手把手教你快速构建一个企业自有“微信”!

融云 RongCloud

开源社区问与答

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

JWTToken在线编码生成

入门小站

工具

OpenHarmony 技术日| 锻英才以应时需 协教育同繁生态

科技汇

中国科技人,在残酷春天里翘首等待

白洞计划

Docker下,极速体验编译pinpoint1.6.x分支

程序员欣宸

Java 分布式 4月月更

「微服务的细节」—— 如何获取本地IP?

袁世超

微服务

区块链行业一周热点回顾|马斯克回应狗狗创始人;虎符交易所回购HOO

区块链前沿News

马斯克 Hoo 虎符交易所 doge

性能测试中QPS取样器和RT取样器

FunTester

在线Excel转TSV工具

入门小站

工具

直播回顾 | 看完这篇入门数仓研发,跑通复杂业务数据建模

个推

数据中台 数据仓库 数据建模 维度建模 范式建模

英特尔分享进军独显市场的背后思考

科技新消息

攻克编译器技术(1)

刘旭东

编译器 4月月更

「Spring」@ConfigurationProperties——从基础到源码

Geek_rze78a

Java spring 源码

云原生应用配置中心简述

穿过生命散发芬芳

4月月更

Docker知识对应验证

Docker 4月月更

C语言总结_数组与函数传参练习题

DS小龙哥

4月月更

揭秘华为云GaussDB(for Influx):最佳实践之数据建模

华为云开发者联盟

MySQL 数据建模 数据模型 华为云 GaussDB(for Influx)

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