【转】异步编程系列(Thread、Task、async/await、ajax等)

 

    经过一番努力,我写的异步编程系列也算有头有尾,当然不是说这个系列已经更新完毕,这个头尾只是表示新旧知识点都有简单涉及到,接下去我还会丰富这一系列并且有机会整个小应用(愿景是弄一个开源组件吧,结合socket)。

 

术语:

APM    异步编程模型,Asynchronous Programming Model

EAP    基于事件的异步编程模式,Event-based Asynchronous Pattern

TAP    基于任务的异步编程模式,Task-based Asynchronous Pattern

TPL    任务并行库,Task Parallel Library

 

    现在我给这个系列整个目录和做个简单介绍。

“概要 + 目录”整理

    C#语言是微软于2000年发布,基于.NET Framewrok框架的、面向对象的高级语言。经过近十三年的发展,经历了5次大的升级,目前最新版本为C#5.0(对应于.NET Framework 4.5)。其中每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。这系列既是针对“异步编程”所写。

C#版本

.NET 版本

Visual Studio 版本

特性描述

C# 1.0

.NET 1.0/1.1

VS 2002/2003

C#的第一个正式发行版本。微软的团队从无到有创造了一种语言,专门为.NET编程提供支持

 

C# 2.0

.NET 2.0

 

 

 

VS 2005

C#语言开始支持泛型,.NET Framework 2.0新增了支持泛型的库

.NET 3.0

新增了一套API来支持分布式通信(Windows Communication Foundation— WCF)、富客户端表示(Windows Presentation Foundation)、工作流(Windows Workflow—WF)以及Web身份验证(Cardspaces)

C# 3.0

.NET 3.5

VS 2008

添加了对LINQ的支持,对用于集合编程的API进行了大幅改进。.NET Framework 3.5对原有的API进行了扩展,从而支持了LINQ   

C# 4.0

.NET 4.0

VS 2010

添加了动态类型(dynamic)的支持,引入了新的轻量级线程同步基元及新的异步编程类库TPL

C# 5.0

.NET 4.5

VS 2012

改进并扩展了.NET4.0中引入的TPL类库,并引入async和await关键字轻松构建异步方法。

 

C#版本.NET版本发布日期特性
C# 1.0.NET Framework 1.02002-02-13委托、事件
C# 1.1.NET Framework 1.12003-04-24APM(异步编程模型)
C# 2.0.NET Framework 2.02005-11-07泛型、匿名方法、迭代器、可空类型
C# 3.0.NET Framework 3.02007-11-06隐式类型
 .NET Framework 3.52007-11-19对象集合初始化、自动实现属性、匿名类型、扩展方法、查询表达式、Lambda表达式、 表达式树、分部类和方法、Linq
C# 4.0.NET Framework 4.02010-04-12动态绑定、命名和可选参数、泛型的协变和逆变、互操作性
C# 5.0.NET Framework 4.52012-08-15异步和等待(async和await)、调用方信息(Caller Information)
C# 6.0.NET Framework 4.62015-07-20C# 6 中的新增功能
 .NET Core 1.02016-06-27 
C# 7.0.NET Framework 4.6.22016-08-02C# 7.0 中的新增功能
C# 7.1.NET Framework 4.72017-04-05 
 .NET Core 2.02016-08-14.NET Core 2.0 的新增功能
C# 7.2.NET Framework 4.7.12017-10-17 
C# 7.3.NET Framework 4.7.22018-04-30 
 .NET Core 2.12018-05-30.NET Core 2.1 的新增功能
 .NET Core 2.22018-12-04.NET Core 2.2 的新增功能
C# 8.0.NET Framework 4.82019-04-18C# 8.0 中的新增功能
 .NET Core 3.02019-09-23.NET Core 3.0 的新增功能
 .NET Core 3.12019-12-03.NET Core 3.1 的新增功能
C# 9.0.NET 52020-09-04C# 9.0 中的新增功能
 .NET 52020-10-13What's new in .NET 5

1. 异步编程基础

资料整理路线:线程----线程池----线程同步----并行任务----三种异步编程模型。首先了解最基础的线程(Thread类),再进一步明白线程管理器(ThreadPool类)。因为多个工作项之间可能出现并行运行,会造成对共享资源的访问问题,所以引入线程同步基元来让共享资源得到合理使用。最后介绍.NET4.0新引入并在.NET4.5中得到优化和扩展的TPL(任务并行库),并结合C# 5.0中新引入的async和await关键字轻松构建异步方法。详细如下:

异步编程:线程概述及使用

异步编程:使用线程池管理线程

异步编程:线程同步基元对象

异步编程:轻量级线程同步基元对象

异步编程:.NET4.5 数据并行

异步编程:异步编程模型 (APM)

异步编程:基于事件的异步编程模式(EAP)

异步编程:.NET 4.5 基于任务的异步编程模型(TAP)

多线程之取消令牌(CancellationToken)

 

 

(译).NET4.X 并行任务中Task.Start()的FAQ

(译).NET4.X并行任务Task需要释放吗?

Task.CompletedTask和Task.Result小记

 

Thread、ThreadPool、Task、Parallel、Async和Await基本用法、区别以及弊端

 

 

       C#语言规范中有说明,调用await t本质会按如下顺序执行:

            1、先调用t.GetAwaiter()方法,取得等待器a;
            2、调用a.IsCompleted取得布尔类型b;
            3、如果b=true,则立即执行a.GetResult(),取得运行结果;
            4、如果b=false,则看情况:
                   4.1、如果a没实现ICriticalNotifyCompletion,则执行(a as INotifyCompletion).OnCompleted(action)
                   4.2、如果a实现了ICriticalNotifyCompletion,则执行(a as ICriticalNotifyCompletion).OnCompleted(action)
                   4.3、执行随后暂停,OnCompleted完成后重新回到状态机;

 

 

  活锁与死锁

    #、加锁后超时释放,且超时要有一定的随机性

    #、加锁按照一定的顺序规则

 

2. async\await 使用注意事项

(译)关于async与await的FAQ

[译]async/await中阻塞死锁

async中必须始终返回Task(@Ron.liang)

此文因在async返回void,在基于任务的异步模式(TAP)并不知道异步任务的状态,当 this.context.Update 执行完成后,发现挂载在内存中的连接已经没有使用,就执行了回收;实际上,此时程序还没有执行完成,但是 TAP 并不知道,所以它不会去阻止这个回收的过程(使用标记),释放 DbContext 后抛出异常

 

Parallel.ForEach和异步的await

  注意:await会导致parallel提前结束,并标示完成状态,但实际上在await后面的代码都没有执行了

 

3. 示例:构建Async同步基元

为TPL提供同步基元,但这只是提供TPL的应用思路,不推荐将这些同步基元应用于项目中。

(译)构建Async同步基元,Part 1 AsyncManualResetEvent

(译)构建Async同步基元,Part 2 AsyncAutoResetEvent

(译)构建Async同步基元,Part 3 AsyncCountdownEvent

(译)构建Async同步基元,Part 4 AsyncBarrier

(译)构建Async同步基元,Part 5 AsyncSemaphore

(译)构建Async同步基元,Part 6 AsyncLock

(译)构建Async同步基元,Part 7 AsyncReaderWriterLock

 

4. 前端中的异步

触碰jQuery:AJAX异步详解

使用jQuery.form插件,实现完美的表单异步提交

 

5. 持续更新……

 

 “加关注”更快获得持续更新。

喜欢本系列博文的园友还请多多推荐image(*^_^*)……感谢大家支持!

 

 

 

推荐阅读:

高性能IO模型浅析

为什么要放弃使用Thread.Sleep

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux里qt画直线_Qt与Web混合开发(一)简单使用

前言《Qt与Web混合开发》系列文章,主要讨论Qt与Web混合开发相关技术。这类技术存在适用场景,例如:Qt项目使用Web大量现成的组件/方案做功能扩展,Qt项目中性能无关/频繁更新迭代的页面用html单独实现,Qt项目提供Web形式…

ES curator离线安装与部署

1.版本: es:6.5.1 curator:5.8.4 下载地址:https://www.elastic.co/guide/en/elasticsearch/client/curator/current/yum-repository.html#_signing_key_2 2.连接不上网站怎么办? 出现无法访问此网页的话&#xff0…

【转】1.1异步编程:线程概述及使用

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享,期待你的查看及点评。 传送门:异步编程系列目录……

安装python3.7.0的步骤_python 3.7.0 安装配置方法图文教程

本文记录了python 3.7.0 安装配置方法,供大家参考,具体内容如下 s1登入python官网 s2下载后缀为exe的可执行文件,并根据自己电脑/主机的系统选择32位还是64位。双击选择“python for windows”() 出现选择下载页面&…

ES:记录curator+nfs进行索引备份、创建快照的一次实践

1. 安装curator工具 下面是我离线安装的过程 https://blog.csdn.net/weixin_43736084/article/details/121775484?spm1001.2014.3001.5501 2.使用fs建立es存储库 我们使用NFS,下面是官网给出的几种仓库类型 2.1 fs建立存储库的注意事项 注意事项,…

【转】1.2异步编程:使用线程池管理线程

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享,期待你的查看及点评。 传送门:异步编程系列目录……

python matplotlib画散点图_python matplotlib库绘制散点图例题解析

假设通过爬虫你获取到了北京2016年3,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温随时间(天)变化的某种规律? a [11,17,16,11,12,11,12,6,6,7,8,9,12,15,14,17,18,21,16…

Hadoop集群HDFS各节点磁盘使用率不平衡,使用balancer做数据平衡

HDFS上各节点磁盘大小不一致,新增节点 数据平衡前,是非常不均衡的,某些节点已经接近90了 集群的数据平衡已经迫在眉睫,必须要搞一搞了。 1.设置传输速率 我这里是万兆网卡,就先设置100M了 在两台master上分别执行&a…

【转】1.3异步编程:线程同步基元对象

开始《异步编程:同步基元对象(上)》 示例:异步编程:线程同步基元对象.rar 如今的应用程序越来越复杂,我们常常需要多线程技术来提高我们应用程序的响应速度。每个线程都由自己的线程ID,当前指令…

怎么查询共享使用人_企业微信微盘怎么共享使用?企业微信如何设置微盘权限?...

使用企业微信办公时,如果有文件需要共享给员工,我们可以将文件上传到微盘的共享空间中,让员工自行下载并查看。那么在企业微信中,我们该如何创建共享空间呢?1如何创建微盘共享空间企业微信微盘共享空间分为两种&#x…

HDFS和Spark配置LZO压缩,Spark读取LZO创建正常Task数量

1.说明 为了解决,数据日益增长并且目前使用Snappy压缩导致的Spark读取时会出现OOM,并且处理起来速度过慢的问题,决定使用LZOIndex来解决问题。 线上Hadoop版本3.2.1,Spark2.3.1,Lzo使用最新版0.4.21 2.未解决的问题…

提供写入的数据少于指定的数据_指定范围数据的汇总

下图(左表)记录的是某公司各部门员工的月薪,现需要根据下图(右表)对指定范围内的月薪进行汇总1、汇总月薪在【2000-4000元】范围内的工资总额。本案例的难点是:【工资总额】数据即是求和列,也是条件列,那么求和函数应该怎么写呢&a…

【转】1.4异步编程:轻量级线程同步基元对象

开始《异步编程:同步基元对象(下)》 示例:异步编程:轻量级线程同步基元对象.rar 在《异步编程:线程同步基元对象》中我介绍了.NET4.0之前为我们提供的各种同步基元(包括Interlocked、Monitor\l…

Windows高级编程学习笔记(一)

写在前面的话 之前学的Windows编程都是界面啊、网络编程啊之类的纯应用层面的东西,总是感觉而自己没有达到自己期望中的水平。什么水平呢?如果让你编写监控系统资源的工具,或者DLL注入相关软件,或者底层安全软件,可以胜…

【转】1.5异步编程:.NET4.X 数据并行

任务并行库 (TPL) 是 .NET Framework 4的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。TPL的目的在于简化向应用程序中添加并行性和并发性的过程,从而提高开发人员的工作效率。TPL会动态地按比例调节并发程度,以便最有…

idea全局搜索搜不全的BUG

搜不全真是坑坏我了,修改业务后,差点就卷铺盖走人了… 修改配置 打开help -> Find Action 输入registry后搜索(点击框内任意一行后,直接输入就是搜索) page.size 将100的值改大,一步到位100000

【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

传送门:异步编程系列目录…… 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作。然而,这个技术存在许多限制。最大的问题是没有一个内建的机制让你知道操作在什么时候…

Spark worker内存不足导致任务失败,报错Likely due to containers exceeding thresholds, or network issues

报错: Lost executor 33 on xx.xx.xx.152: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages. 原因: 由于spark某节点可用内存不足导致整个任务失败,在执行…

【转】1.7异步编程:基于事件的异步编程模式(EAP)

传送门:异步编程系列目录…… 上一篇,我给大家介绍了“.NET1.0 IAsyncResult异步编程模型(APM)”,通过Begin*** 开启操作并返回IAsyncResult对象,使用 End*** 方法来结束操作,通过回调方法来做异步操作后其它事项。然…

【转】1.8异步编程:.NET 4.5 基于任务的异步编程模型(TAP)

传送门:异步编程系列目录…… 最近我为大家陆续介绍了“IAsyncResult异步编程模型 (APM)”和“基于事件的异步编程模式(EAP)”两种异步编程模型。在.NET4.0 中Microsoft又为我们引入了新的异步编程模型“基于任务的异步编程模型(TAP)”,并且推荐我们在开…