AICon 深圳站 Keynote 嘉宾官宣!共探AI价值转化的实践路径 了解详情
写点什么

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

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

关注

评论

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

论现代科技发展趋势:停滞、减速 OR 蓄力?

老猿Python

发展 科技 软件技术

架构实战营模块六总结

竹林七贤

故事|订单系统中的补偿事务

悟空聊架构

故事 事务 6月日更 订单系统 补偿事务

用EasyRecovery“监控硬盘”功能检测硬盘问题的方法

淋雨

数据恢复 EasyRecovery 文件恢复

JDK 工具大合集

看山

Java 6月日更

🌏【架构师指南】总结分库分表的实现方案

码界西柚

分库分表 架构师 6月日更 实现方案

前端开发华为鸿蒙系统应用 OpenHarmony JS

孙叫兽

华为 鸿蒙 OpenHarmony 鸿蒙开发 引航计划

【Vue2.x 源码学习】第十五篇 - 生成 ast 语法树 - 构造树形结构

Brave

源码 vue2 6月日更

一分钟开发一个表单

蛋先生DX

vue.js 表单 动态表单 6月日更

react源码解析13.hooks源码

全栈潇晨

React

缓存的世界 Redis(二)-持久化

卢卡多多

redis redis持久化 配置文件持久化 6月日更

【LeetCode】石子游戏Java题解

Albert

算法 LeetCode 6月日更

面试官问“你有什么问题要问我”,如何完美回答?

架构精进之路

6月日更

Linux之ls命令

入门小站

Linux

连续七年,我们持续领跑

Java包装类(Integer 详解 )

若尘

java编程 6月日更

项目经理如何有效管理需求变更?

万事ONES

需求管理 ONES 项目经理

MySQL基础之十三:约束

打工人!

MySQL 6月日更

VS code常用插件推荐(总结整理篇)

孙叫兽

vscode 大前端 插件 Vue 3 引航计划

Java8 的时间库(1):介绍 Java8 中的时间类及常用 API

看山

Java 6月日更

密码学系列之:feistel cipher

程序那些事

加密解密 密码学 程序那些事

Python——字典的使用

在即

6月日更

OpenVINO+微软黑客松比赛项目简介

IT蜗壳-Tango

IT蜗壳 6月日更

快来,这里有23种设计模式的Go语言实现

华为云开发者联盟

线程 设计模式 单例模式 Go 语言

并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

MetaThoughts

Java 多线程 并发 并发王者

软件工程,其实没有任何工程而言

实力程序员

页面怎么布局,当然是Grid ԅ(¯﹃¯ԅ)

空城机

JavaScript 大前端 6月日更 页面布局

【21-8】PowerShell 输入输出

耳东@Erdong

PowerShell 6月日更

【Flutter 专题】103 初识 Flutter Mixin

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 6月日更

PO 就是Scrum中的产品经理?别再搞不清啦

万事ONES

项目管理 Scrum 敏捷开发 PO ONES

「SQL数据分析系列」4. 过滤操作

Databri_AI

数据库 SQL语言

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