一. 背景

揭秘:

  在前面的章节介绍过,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. 【整理】ABAP快捷启动Debug三种方式

    ABAP快捷启动Debug三种方式 1./H :Start Debugger 正常的Debug模式,会从头开始执行: 2./HS :Start System Debugging 区别于"/H ...

  2. Spring Boot项目启动的几种方式

    Spring Boot项目启动的几种方式 方式一:右击启动或者点击intellij右上角的启动按钮 我们访问下浏览器看一下效果 方式二:利用maven启动 我们先进入到项目文件下,然后执行命令   m ...

  3. 如何计算机车启动牵引力,机车启动的两种方式

    <机车启动的两种方式>由会员分享,可在线阅读,更多相关<机车启动的两种方式(3页珍藏版)>请在人人文库网上搜索. 1.机车的两种启动方式1. 机车以恒定功率启动的运动过程由公式 ...

  4. 三菱四节传送带控制梯形图_四节传送带PLC控制课程设计.doc

    四节传送带PLC控制课程设计 四节传送带PLC控制课程设计 一 设计背景和功能概述 二 电气原理图与功能详细分析说明 三 部分元件的说明 四 软件流程图 五 总结 六 源程序清单 七 参考文献 四节传 ...

  5. 直接启动、星三角启动、自耦降压启动、软启动,哪种方式适合消防水泵控制器?

    消防水泵控制器有很多,目前市场对消防水泵控制器需求比较大的有:一用一备控制器GYXF3100-2XP.GYXF360-2XP.GYXF708-2WP,二用一备控制器GYXF3100-3XP,三用一备控 ...

  6. java 线程同时启动_java多个线程同时启动的两种方式

    [背景]今天遇到一个并发问题,为了在开发环境复现这个bug,需要让多个线程同时执行到某条语句. [解决方案] java1.5的concurrent包下的CyclicBarrier 和 CountDow ...

  7. sequence启动的两种方式

    文章目录 前言 1.启动sequence的两种方式 2.直接启动sequence 3.间接启动sequence 4.间接启动sequence的objection管理 总结 前言 如果把UVM验证环境比 ...

  8. linux 设置开机启动项三种方式

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务. 在解问题之前先来看看Linux的启动流程 Linux的启动流程 主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确定运 ...

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

    有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务. 在解问题之前先来看看Linux的启动流程 Linux的启动流程 主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确定运 ...

最新文章

  1. startsWith(),endsWith()的作用,用法,判断字符串a 是不是以字符串b开头或结尾
  2. CSS滤镜实现火狐、IE兼容
  3. 内存泄漏检测工具(转载)
  4. Kafka架构设计:分布式发布订阅消息系统
  5. Apache RocketMQ 正式开源分布式事务消息
  6. 找规律万能公式_有一个万能公式,可以帮你解决任何烦恼!
  7. dataframe 空值替换为0_dataframe取元素方法总结
  8. ios 上传图片失败 小程序_微信小程序ios端 使用ajaxSubmit上传图片失败,android没问题...
  9. 二叉树层序遍历_求二叉树的层序遍历
  10. vc udp 广播接收和发送_udp聊天?使用udp+python实现多人聊天室
  11. 引用 java的一些基本概念
  12. 反转单链表的几种方法
  13. html5 video标签嵌入视频
  14. 浅析局域网聊天软件的能力
  15. air724UG + Luat玩转物联网(一) 环境搭建及固件烧录
  16. 怎样用计算机弹虫儿飞,吉他初学者必看:虫儿飞指弹教程
  17. 已解决raise JSONDecodeError(“Expecting value”, s, err.value) from None
  18. 物理木板过河问题java_抖音捡木板过河
  19. Excel中VBA编程学习笔记(十一)--正则表达式
  20. 有道云笔记迁移到为知笔记

热门文章

  1. jdbc执行sql 不支持“variant”数据类型。
  2. 原生js简单实现双向数据绑定原理
  3. JPA中的@MappedSuperclass
  4. Windows中查找文件被何进程使用
  5. [Buzz.Today]2013.03.14
  6. 154. Find Minimum in Rotated Sorted Array II
  7. [Leetcode][第117题][JAVA][填充每个节点的下一个右侧节点指针][BFS]
  8. HDU - 2571 
  9. java 8 io_Java IO8:IO简单总结
  10. jdbc获取clob图片_jdbc方式读取oracle的clob字段实例