• 多线程异步编程示例和实践-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需要在其运行过程中至少有一个前台线程在跑,否则会直接退出.

    准备再写一篇博客,分享几个多线程异步我们踩过的坑和解决方法。

  • 相关阅读:
    [leetcode] Longest Palindromic Substring
    [leetcode] Add Two Numbers
    [leetcode] Longest Substring Without Repeating Characters
    [leetcode] Median of Two Sorted Arrays
    [leetcode] Two Sum
    poj 2718 Smallest Difference
    AOJ 0525 Osenbei
    poj3190 stall revertation
    poj1328Radar Installation
    poj 2376 Cleaning Shifts
  • 原文地址:https://www.cnblogs.com/fg-fd/p/7026861.html
Copyright © 2020-2023  润新知