【C# TAP 异步编程】一 、async 修饰符(标记)
async的作用:
1、async是一个标记,告诉编译器这是一个异步方法。
2、编译器会根据这个标志生成一个异步状态机。
3、编译器将原异步方法中的代码清空,写入状态机的配置,原先异步方法中的代码被封装入状态机。
4、async 关键字是上下文关键字,原因在于只有当它修饰方法、lambda 表达式或匿名方法时,它才是关键字。 在所有其他上下文中,都会将其解释为标识符。
5、如果 async 关键字修改的方法不包含 await 表达式或语句,则该方法将同步执行。
async 的异步方法的刨析
async是什么呢?我通过一段代码来了解,代码如下:
namespace MyTask;
class Program
{
public static void Main(string[] args)
{
Task<int> baconTask = FryBaconAsync(3);
Console.Read();
}
static async Task<int> FryBaconAsync(int slices)
{ return 3; //整数3和Task<int>不存在隐形转化啊,怎么就可以return 3; 如果你也存在这个疑问 请继续往下阅读,接下去详细分析。
}
}
ILspy反编译后代码:

以下开始分析反编译后的源代码:
用到的知识点:IAsyncStateMachine接口、AsyncTaskMethodBuilder<TResult>类,这两个功能必须详细理解。
1、编译器 async标记给异步方法生成 一个叫AsyncStateMachine异步状态机的特性附着于方法上,告诉CLR这是一个异步状态机。如下图所示:

编译器将原异步方法中的代码清空,写入状态机的配置,原先异步方法中的代码被封装入状态机。

2、编译器还生成一个异步状态机的类。
该类继承IAsyncStateMachine接口。IAsyncStateMachine接口有两个方法:MoveNext()、SetStateMachine();
该类除了以上两个方法,还有重要两字段:AsyncTaskMethodBuilder<TResult> 表示返 回任务的异步方法生成器。state 状态。
源代码中返回值(return 3;)被封装入异步状态机的<>t__builder 字段中。最后的返回值 return stateMachine.<>t__builder.Task 是Task<TResult>类型。
通过IL代码我们就可以清楚的得知async就是语法糖。
注意:awaiter.GetResult()、awaiter.Result都会阻塞线程

返回类型
异步方法可以具有以下返回类型:
- Task:对于事件处理程序以外的不返回值的方法,应返回 Task
- Task<TResult>(对于返回值的异步方法)。
void:对于事件处理程序,事件使用的是void类型的委托。- ValueTask<TResult> C#7.0
- 使用 IAsyncEnumerable<T> 的异步流C#8.0
相信查看:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/async/async-return-types
【C# TAP 异步编程】一 、async 修饰符(标记)的更多相关文章
- 异步编程(async&await)
前言 本来这篇文章上个月就该发布了,但是因为忙 QuarkDoc 一直没有时间整理,所以耽搁到今天,现在回归正轨. C# 5.0 虽然只引入了2个新关键词:async和await.然而它大大简化了异步 ...
- 《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await
C# 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用.在此之前的异步编程实现难度较高,async使异步编程的实现变得 ...
- .NET4.5新特性之异步编程(Async和Await)的使用
一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个"主题".即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语 ...
- 异步编程(Async和Await)的使用
.net4.5新特性之异步编程(Async和Await)的使用 一.简介 首先来看看.net的发展中的各个阶段的特性:NET 与C# 的每个版本发布都是有一个“主题”.即:C#1.0托管代码→C#2. ...
- .Net 4.5 异步编程初试(async和await)
.Net 4.5 异步编程初试(async和await) 前言 最近自己在研究Asp.Net Web API.在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过, ...
- 【C# TAP 异步编程】三、async\await的运作机理详解
[原创] 本文只是个人笔记,很多错误,欢迎指出. 环境:vs2022 .net6.0 C#10 参考:https://blog.csdn.net/brook_shi/article/details/ ...
- C# 异步编程(async&await)
同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...
- C#~异步编程再续~async异步方法与同步方法的并行
返回目录 今天晚上没事写了个测试的代码,又看了看.net的并行编程,两个方法,一个是异步async修饰的,另一个是普通的方法,在控制台程序的Main方法里去调用这两个方法,会有什么结果呢? 首先我们看 ...
- .NET异步编程初识async与await
这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问 ...
随机推荐
- manjaro20夜灯夜间模式开关
- Cesium入门3 - Cesium目录框架结构
Cesium入门3 - Cesium目录框架结构 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ app目录 下 ...
- 带你十天轻松搞定 Go 微服务系列(三)
序言 我们通过一个系列文章跟大家详细展示一个 go-zero 微服务示例,整个系列分十篇文章,目录结构如下: 环境搭建 服务拆分 用户服务(本文) 产品服务 订单服务 支付服务 RPC 服务 Auth ...
- 【Vue源码学习】依赖收集
前面我们学习了vue的响应式原理,我们知道了vue2底层是通过Object.defineProperty来实现数据响应式的,但是单有这个还不够,我们在data中定义的数据可能没有用于模版渲染,修改这些 ...
- 人口信息普查系统-JavaWeb-五
今天分享人口普查系统删除查询前端代码 <%@ page language="java" contentType="text/html; UTF-8" pa ...
- Java流程控制01:用户交互Scanner
Scanner对象 之前我们学习的基本语法并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入.java.Scanner 是java5 的新特征,我们可以通过Sca ...
- MySQL不建议delete删除数据
InnoDB存储架构 从这张图可以看到,InnoDB存储结构主要包括两部分:逻辑存储结构和物理存储结构. 逻辑上是由表空间tablespace -> 段segment或者inode -> ...
- Mysql 返回JSON值属性的函数 (五)
本节中的函数返回JSON值的属性. JSON_DEPTH(json_doc) 返回JSON文档的最大深度.NULL如果参数为,则 返回 NULL.如果参数不是有效的JSON文档,则会发生错误. 一个空 ...
- Elasticsearch使用系列-基本查询和聚合查询+sql插件
Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 Elasticsearch使用系列-基本查询和聚合查询+sql插件 Elas ...
- Ubuntu18修改系统时间
1. 运行 tzselect 依次选择 Asia -> China -> Beijing Time 2. 复制文件到 /etc 下 sudo cp /usr/share/zoneinfo/ ...