实践-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的更多相关文章

  1. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

  2. Android Gradle 完整指南(转)

    本文转载来自:http://www.jianshu.com/p/9df3c3b6067a 为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前 ...

  3. Android Gradle 完整指南

    为什么需要学Gradle? Gradle 是 Android 现在主流的编译工具,虽然在Gradle 出现之前和之后都有对应更快的编译工具出现,但是 Gradle 的优势就在于它是亲儿子,Gradle ...

  4. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity

    上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...

  5. 实践基于Task的异步模式

    Await 返回该系列目录<基于Task的异步模式--全面介绍> 在API级别,实现没有阻塞的等待的方法是提供callback(回调函数).对于Tasks来说,这是通过像ContinueW ...

  6. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  7. UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)

    前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...

  8. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...

  9. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

随机推荐

  1. 12.模板别名以及auto定义返回值

    #include <iostream> #include <array> using namespace std; //定义返回值类型 template<class T1 ...

  2. AAC编解码

    AAC编码可以使用faac /** 初始化 @param sampleRate 音频采样率 @param channels 通道数 @param bitSize 音频采样精度 16 */ - (voi ...

  3. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第一篇:准备工作

    摘要      本文将简要介绍这个文章系列的目的.形式及大体内容.并且完成开始学习这个系列前所必要的准备工作. 前言      ASP.NET MVC作为微软官方的MVC解决方案,推出有一段时间了.可 ...

  4. css中hack是什么

    css中hack是什么 一.总结 1.CSS hack:由于不同厂商的浏览器,比如Internet Explorer,Safari,Mozilla Firefox,Chrome等,或者是同一厂商的浏览 ...

  5. UML学习总结(1)——UML学习入门

    随着亲手接触的项目越来越多,项目的复杂度越来越大,项目的理解程度也变的很难,尤其是在接收一个别人已经做好的项目时,你迫切先想到的就是"有没有文档啊",当然是各种文档,概要设计文档, ...

  6. [D3] Modify DOM Elements with D3 v4

    Once you can get hold of DOM elements you’re ready to start changing them. Whether it’s changing col ...

  7. 【POJ 3415】Common Substrings

    [链接]h在这里写链接 [题意]     求两个串的长度大于等于k的公共子串个数.     相同的重复计数. [题解]     先把两个字符串用一个分隔符分开.最好比出现的字符都大的一个数字.    ...

  8. IIS FTP匿名登录不成功

    FTP网站没有开启匿名登录的权限,对你没有看错.可能你的虚拟目录已经设置了如下所示的内容:    但是,单击上右图时,在其功能视图中的FTP身份验证中,可能并未启用"匿名身份验证",如下右图所示.启动 ...

  9. 深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 4:Debugging: Gradient Checking

    1 Gradient Checking 说明 前面我们已经实现了Linear Regression和Logistic Regression.关键在于代价函数Cost Function和其梯度Gradi ...

  10. cocos 关于文件名称的各种坑 各种斜杠坑

    cocos 全部文件路径 的斜杠 必须 用 /  而不能够用 \ 不然编译到安卓各种坑 相对路径 第一个字符不可 带 / /*比如 res/test.png 这样的应该是标准的 /res/test.p ...