一. 背景

揭秘:

  在前面的章节介绍过,Task出现之前,微软的多线程处理方式有:Thread→ThreadPool→委托的异步调用,虽然也可以基本业务需要的多线程场景,但它们在多个线程的等待处理方面、资源占用方面、线程延续和阻塞方面、线程的取消方面等都显得比较笨拙,在面对复杂的业务场景下,显得有点捉襟见肘了。

  正是在这种背景下,Task应运而生。

  Task是微软在.Net 4.0时代推出来的,也是微软极力推荐的一种多线程的处理方式,Task看起来像一个Thread,实际上,它是在ThreadPool的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool。

二. Task的4种启动方式

概要:

  Task的启动有4种方式,其中3种异步启动开启一个新线程,1种同步启动的方式(有点和委托类似,BeginInvoke异步启动,Invoke同步启动),分别是:实例化的方式+Start方法启动、Task下Run方法启动、TaskFactory工厂的StartNew方法启动、Task下的同步方法RunSynchronously 启动。

1. 实例化的方式启动,调用Start方法

  Task的构造函数中的参数是Action委托(注:不是Action<>多个重载),所以直接使用 ()=>{   }的方式传参,简洁明了,然后调用Start方式启动。

2. 调用Task类下的静态方法Run,进行启动

  使用该方式启动,更加简洁,不需要实例化,也不需要调用Start方法,Run方法直接通过Action委托的方式进行传参即可(即:  ()=>{} )。

3. TaskFactory工厂启动

  使用TaskFactory工厂的StartNew方法启动,其中TaskFactory工厂可以直接实例化,或者 Task.Factory (推荐)。

4. 实例化方式RunSynchronously同步启动

  Task实例化的方式,然后调用同步方法RunSynchronously ,进行线程启动。(PS: 类似委托开启线程,BeginInvoke是异步,而Invoke是同步)

三. Task的线程等待和延续

揭秘:

  线程等待和延续通常情况放在一起来说,在同步方法中,即在单线程中,业务代码块按照从上往下的顺序执行,下面的代码块必须要等上面的代码块执行完毕后才能继续执行,这本身就是一种等待和延续,只不过是单线程内的等待和延续。

  同理,来到多线程领域,这里的等待就不单单局限于代码块之间的等待和延续了,而是上升到某个线程 要等待 另外一个线程执行完毕后方能执行,这里特别说明一下,前面的章节提到线程等待基本上都是主线程在等子线程,当然,完全可能是子线程之间的相互等待和延续(实际上,这种情况更多)。

  Task下的线程等待和延续主要以下几类:

  ①. Wait:针对单个Task的实例,可以task1.wait进行线程等待.  <Task的实例方法>

  ②. WaitAny:执行的线程等待其中任何一个线程执行完毕即可执行(如果主线程执行,则卡主线程)  <Task的静态方法>

  ③. WaitAll:执行的线程等待其中所有线程执行完毕方可执行(如果主线程执行,则卡主线程)       <Task的静态方法>

  ④. WhenAny:与下面ContinueWith配合执行,当传入的线程中任何一个线程执行完毕,继续执行ContinueWith中的任务(属于开启新线程,不卡主线程)   <Task的静态方法>

  ⑤. WhenAll:与下面ContinueWith配合执行,当传入的线程中所有线程执行完毕,继续执行ContinueWith中的任务(属于开启新线程,不卡主线程)     <Task的静态方法>

  ⑥. ContinueWith:和上面WhenAny和WhenAll配合使用    <Task的实例方法>

1. WaitAny(执行的线程等待其中任何一个线程执行完毕即可执行)

  这里给出线程等待加入集合中的代码,下面的线程等待通用这一部分代码,将不再列出。

2. WaitAll(执行的线程等待其中所有线程执行完毕方可执行)

3. WhenAny+ContinueWith

   当其中一个线程执行完成后,新开启了一个线程执行,继续执行新业务,所以执行过程中,不卡主线程。

4. WhenAll+ContinueWith

  当其中所有线程执行完成后,新开启了一个线程执行,继续执行新业务,所以执行过程中,不卡主线程。

四. TaskFactory的线程等待

说明: TaskFactory可以开启线程,当然也对应的线程的等待和延续。

  ①:ContinueWhenAny:等价于Task的WhenAny+ContinueWith

  ②:ContinueWhenAll:等价于Task的WhenAll+ContinueWith

1. ContinueWhenAny

2. ContinueWhenAll

第四节:Task的启动的四种方式以及Task、TaskFactory的线程等待和线程延续的解决方案的更多相关文章

  1. Git应用详解第四讲:版本回退的三种方式与stash

    前言 前情提要:Git应用详解第三讲:本地分支的重要操作 git作为一款版本控制工具,其最核心的功能就是版本回退,没有之一.熟悉git版本回退的操作能够让你真真正正地放开手脚去开发,不用小心翼翼,怕一 ...

  2. android activity启动的4种方式记录及打开其他应用的activity的坑

    Android启动的四种方式分别为standard,singleTop,singleTask,singleInstence. standard是最常见的activity启动方式,也是默认的启动的方式. ...

  3. Linux->ZooKeeper开机启动的俩种方式

    两种方式可以实现开机自启动 第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行, 其中export JAVA_HOME=/usr/jav ...

  4. linux 设置开机启动项两种方式

    原文链接:http://blog.csdn.net/karchar/article/details/52489572 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务. 在解问题之前 ...

  5. spring容器启动的三种方式

    一.在Web项目中,启动Spring容器的方式有三种,ContextLoaderListener.ContextLoadServlet.ContextLoaderPlugin. 1.1.监听器方式: ...

  6. ZooKeeper开机启动的俩种方式

    两种方式可以实现开机自启动 第一种:直接修改/etc/rc.d/rc.local文件 在/etc/rc.d/rc.local文件中需要输入两行, 其中export JAVA_HOME=/usr/jav ...

  7. Express全系列教程之(四):获取Post参数的两种方式

    一.关于POST请求 post方法作为http请求很重要的一部分,几乎所有的网站都有用到它,与get不同,post请求更像是在服务器上做修改操作,它一般用于数据资源的更新.相比于get请求,post所 ...

  8. Svn服务启动的两种方式

    一.svn服务器启动 › cmd命令行启动:vsvnserve -d –r 文档仓库路径 -d 后台执行 › -r 版本库的根目录 二.›Windows服务自动启动     利用xp.2000 以上的 ...

  9. linux开机启动的三种方式

    参考:www.cnblogs.com/gzggyy/archive/2012/08/07/2626574.html 一./etc/rc.local 其中的rc.local是在完成所有的系统初始化之后执 ...

随机推荐

  1. Springboot配置文件解析器

    @EnableScheduling @MapperScan(value = "com.****.dao") @EnableTransactionManagement @Enable ...

  2. python爬虫【实战篇】模拟登录人人网

    requests 提供了一个叫做session类,来实现客户端和服务端的会话保持 使用方法 1.实例化一个session对象 2.让session发送get或者post请求 session = req ...

  3. 安装和使用 memcached

    memcached 和 Grails,第 1 部分:安装和使用 memcached 学习 memcached 命令并评估缓存性能 本文是系列文章的第 1 部分,主要介绍 memcached 和 Gra ...

  4. MySQL之表相关操作

    一 存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 详见:http://www.cnblogs.com/linhaifeng/articles/7213670.html ...

  5. H5页面长按导致app崩溃问题解决

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 最近用H5页面做了个安卓的项目,但是在H5页面中长按文字内容,会导致APP崩溃掉... ...

  6. 【vue】vue +element 搭建项目,mock模拟数据(纯干货)

    1.安装mockjs依赖 (c)npm install mockjs --save-dev 2.安装axios(Ajax) (c)npm install --save axios 3.项目目录 4.设 ...

  7. CentOS7.5修改字符集

    乱码产生的原因: 计算机中储存的信息都是用二进制数表示的:而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为" ...

  8. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤

    1.插入贴膜卡和sim卡:进入“设置—电话—sim卡应用程序”选择CDMA电信解锁: 2.越狱设备,添加cydia.gpplte.com源,安装“6S/6/5S/5C/5电信新补丁”: 3.打卡gpp ...

  9. Entity Framework Core系列之DbContext(修改)

    上一篇我们介绍了Entity Framework Core系列之DbContext(添加),这一篇我们介绍下修改数据 修改实体的方法取决于context是否正在跟踪需要修改的实体. 下面的示例中实体由 ...

  10. 292. Nim Game(easy)

    You are playing the following Nim Game with your friend: There is a heap of stones on the table, eac ...