.Net异步编程简介
分类: .Net技术 ◆ 标签: #异步编程 #.Net #基础 ◆ 发布于: 2023-06-04 18:42:39

最近在学习.Net的异步编程,并行编程,以及多线程相关的知识,因此写了这一系列的文章作为学习的记录。
目前我们有很多种工具都适合用于异步/并行编程,但是每种语言对于这个领域的支持力度各不相同,像Java
的编程模型从Java7
开始引入了几个基于多线程的工具,例如提供fork/join API, 预定义的线程池等等,同时需要大量的线程安全的集合以及各种原子工具以及操作,还需要了解各种锁,例如CAS
锁等等,对程序员的要求非常之高,编程模型也非常困难,但是对于C#
以及对应的.Net
以及.Net Core
, 微软推出了更为明晰易用的方式用于异步/并行编程,例如我们即将要介绍的在语言级别的async
,await
关键字,以及随之引入的TAP
异步编程模型,以及TPL
并发编程模型,以及万不得已更为底层的基于System.Threading
的Thread
编程模型等等。相比较其他的语言, C#
以及.Net
平台提供了对程序员更为友好的编程界面,但是C#
和.Net
的特性都有一个鲜明的特点,就是易用难精,主要C#
和.Net
提供的工具实在太好用了,好用到只需要遵守最佳指导,完全不必关心背后,这样其实也不利于学习。
因此这个系列仔细的学习一下C#
和.Net
的异步编程模型,下一个系列学习TPL
基于任务的并发编程,最后一个系列学习Thread
。
在开始我们的学习之前,我们首先需要熟悉几个基本的概念:
- 什么是程序入口
- 什么是程序控制
- 异步编程和并发编程以及多线程编程有什么关联和区别。
什么是程序入口
程序入口最为直观的感受就是我们在C/C++/C#/Java中的那个Main函数或者是Main方法,这是所有的基于这些语言的最开始被OS调用的一个起始点。除了这个最直观的感受之外,OS是从这里开始给您的应用分配资源,然后由CLR介入管理您的应用,毕竟dotnet的平台还是一个托管的平台,因此在正是进入到用户的这个Main函数之前,实际上CLR(或者是JVM)已经有了很多调用了,当然针对于用户的应用程序来说,这是入口没有什么不妥,要有一个映像就是您的应用除了自己的代码之外,后面还是有一个隐形的手,会帮助你控制一些资源。
什么是程序控制以及控制点
我们想像一下我们的代码,实际上是根据代码的编写顺序,一条一条指令的在执行。当然这是在同步环境下是这样的,那么这个一步一步的流程就是称为程序的控制,我们不仅有顺序执行的控制,也有使用if, while, for, foreach等控制。另外一个需要理解的是控制点,所谓的控制点,实际上可以理解为程序执行步骤中用于指定位置的指针,例如执行到了第四行,那么控制点就是在第四行。
异步编程/并发编程/多线程编程
异步编程相对于并发编程以及多线程编程更高阶的概念,是最为贴近日常的应用场景的,代表着可以同时做更多的事,而不用被block
在某一件事上。并发编程时是较为的基础的一个概念,虽然也代表同时做很多事,但是并发编程更为强调同时完成一件事情,而且从概念上来讲并发和异步实际没有什么必然的联系。而多线程编程是语言平台提供的基础工具,例如我们的并发编程是需要多线程编程技术的支撑的。对于.Net
平台来讲,微软使用TAP, async, await
来完成异步编程,使用TPL
来完成并发编程,通过System.Threading.xxx
来完成对于托管线程的管理。
异步编程和多线程
异步编程不一定使用多线程。CLR可以决定,也可以使用Task类进行一定的控制,例如运行在background 线程上等等。
下一小节我们来学习异步编程场景介绍以及async和await的正确使用方法和理解方法