实践-Task
实践-Task
上篇博文中,我们介绍了Thread和ThreadPool:
多线程异步编程示例和实践-Thread和ThreadPool
本文中我们继续,说一下TPL(Task Parallel Library, 简称TPL)。
在实际的开发中,使用线程池相当复杂,线程的异常捕获、传递以及编排这些问题实现起来都很复杂。
从 .NET Framework 4 开始,TPL 是编写多线程代码和并行代码的首选方法。顾名思义,任务并行库 (TPL) 基于任务的概念。 术语“任务并行”是指一个或多个独立的任务同时运行。 任务表示异步操作,在某些方面它类似于创建新线程或 ThreadPool 工作项,但抽象级别较高。 任务的提供有两个主要好处:
1). 系统资源的使用效率更高,可伸缩性更好。
在后台,任务排队到 ThreadPool,ThreadPool 已使用登山等算法进行增强,这些算法能够确定并调整到可最大化吞吐量的线程数。 这会使任务相对轻量,可以创建很多任务,启用细化并行
2). TPL提供了一组简单丰富的 API,这些 API 支持等待、取消、继续、可靠的异常处理、详细状态、自定义计划等功能。降低多线程编码和并行编程的复杂度,提升开发效率。
1. 创建和运行任务

多次执行,输出结果:


上面的示例中,创建和运行任务有两种方式:
- 创建任务->启动任务,Start立即执行
- 直接创建并启动任务
多次运行,发现两种执行结果,为什么?
task1和task2的任务都被放置在线程池的工作者线程中,任务的执行顺序是不确定的。
2. 取消任务
关键的对象:CancellationToken

测试代码:

运行输出:

3. 创建任务集合并输出结果

关键知识点:
- Task支持返回值:Task<T>
- 获取Task的返回值:Task.Result
Task.Result操作意味着什么?等待Task异步调用完成,从效果上等同于Wait方法
4.处理任务异常

测试代码:

运行输出:

关键知识点:
- 通过Catch捕获Task的异常是AggregateException,一个被封装的异常,需要通过InnerException访问底层异常
- 推荐使用GetWaiter和GetResult方法访问Task的结果,可以获取到原始异常;
- 通过ContinueWith处理OnlyOnFaulted事件,捕获的异常也是一个被封装的异常,需要通过InnerException访问底层异常
5. 多任务的串行化

关键知识点:
- Task.ContinueWith
- Task逐层传递
- 第一个任务Start启动即可,不需要全部任务启动。
6. 多任务等待执行完成

多次执行输出:


关键知识点:
- Task.WaitAll
- Task执行顺序是随机的,线程池机制(两种调度算法)
8. 创建子任务



关键知识点:
- TaskCreationOptions.AttachedToParent
- 除非所有子任务(子任务的子任务)结束运行,否则创建任务(父任务)不会认为已经结束
- 父任务异常不会影响子任务执行
- 子任务异常不会影响父任务执行
9. 补充一个知识点:前台线程和后台线程
应用程序必须运行完所有的前台线程才可以退出;
对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
那么,Thread、线程池的线程、Task都各自属于哪一类线程?
- 使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false.
- 属于托管线程池的线程(即其 IsThreadPoolThread 属性为 true 的线程)是后台线程
- Task都是后台线程:Task需要在其运行过程中至少有一个前台线程在跑,否则会直接退出.
准备再写一篇博客,分享几个多线程异步我们踩过的坑和解决方法。
实践-Task的更多相关文章
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
- Android Gradle 完整指南(转)
本文转载来自:http://www.jianshu.com/p/9df3c3b6067a 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前 ...
- Android Gradle 完整指南
为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle ...
- Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...
- 实践基于Task的异步模式
Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...
- Hangfire项目实践分享
Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...
- UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
随机推荐
- 81.内存模式实现cgi查询
创建全局的二级指针 char ** g_pp;//全局的二级指针 获取数据有多少行 //获取行数 int getimax() { ; FILE *pf = fopen(path, "r&qu ...
- ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第六篇:拦截器
摘要 本文将对“MVC公告发布系统”的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法. 一个小难题 我们继续完善“MVC公告发布系统”, ...
- 用jquery获取单选按钮选中的内容 和 获取select下拉列表选中的值
1.<label><input name='reason' type='radio' value='您的评论内容涉嫌谣言' />您的评论内容涉嫌谣言</label> ...
- Flask项目之手机端租房网站的实战开发(七)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- 洛谷——P1096 Hanoi双塔问题
https://www.luogu.org/problem/show?pid=1096 题目描述 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个 ...
- stm32关于.o的错误
是因为没有加入官方库的原因,而且编译出错之后不能跳转到那里.
- cURL(wget)—— 测试 RESTful 接口及模拟 GET/POST/PUT/DELETE/OPTIONS 请求
cURL 是一个简单的 http 命令行工具.与最优秀的 Unix 工具一样,在设计之时,cURL 是个小型程序,功能十分专一,而且是故意为之,仅用于访问 http 服务器.(在 Linux 中,可以 ...
- Linux下开启关闭防火墙
一.Linux下开启/关闭防火墙命令 1) 永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重 ...
- POS的一点杂笔
仅限于POS 仅限于POS 仅限于POS A 字母字符 N 数字 S 特殊字符 an 字母和数字字符 as 字母和特殊字符 ns 数字和特殊字符 ans 字母.数字和特殊字符 MM 月份 DD 日期 ...
- jQuery实现点击开关图片切换
原型大概是这样的 image 需求:点击右侧的蓝色眼睛,会变成 关键代码: /* 实现图片切换 */ $(".imgclick").toggle(function(){ $(thi ...