【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等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问 ...
随机推荐
- Go 获取键盘输入,进制转换
#### Go 获取键盘输入,进制转换 最近爱上<<珂矣的心灵独语>> 连续听一下礼拜也不觉得厌: 喜欢她的宁静与安然,喜欢她的坦荡与欢喜,喜欢她的禅意与智慧; ***撑着一苇 ...
- 关于python 爬虫遇到的反盗链
首先声明:目标网址是从别人案例里得到的,内容你懂的... 本来闲来无事,学习下爬虫的知识,遇到恶心的反盗链,好在目标网址防盗链简单,代码里注明了如何去查看目标网址的防盗检查: 防盗链原理 http标准 ...
- 集合框架-HashSet存储自定义对象
1 package cn.itcast.p4.hashset.test; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 6 ...
- zabbix报错整理
1.cannot connect to [[172.16.2.225]:10050]: [113] No route to host 这种一般是网络连接问题 排查:在server上telnet 172 ...
- centos7无法访问虚拟机web服务
第一种: 先看下防火墙状态:firewall-cmd --state 关闭防火墙再试试:systemctl stop firewalld.service 第二种,不想关闭防火墙 放开http服务 fi ...
- (4)puppet常用的资源及其常用属性
1.user资源就是用来管理目标服务器上的用户的,比如创建用户.修改用户.删除用户,user资源的常用属性如下 user{'test': ensure => present, uid => ...
- 使用VSCode在本地电脑上对树莓派远程开发
目的及原理 有时身边没有额外的显示器和键盘,或者有时树莓派在另一个屋子连接着路由器,那么当我们想在树莓派上做开发时就可以使用VS Code的远程开发能力.下面一张图显而易见地说明了远程开发的工作原理( ...
- 有关softmax函数代码实现的思考
有关softmax函数代码实现的思考 softmax函数 def softmax2(x): if x.ndim == 2: x = x.T x = x - np.max(x, axis=0) y = ...
- 1.kafka
什么是Kafka 1.Apache Kafka是一个开源消息系统,由Scala写成. 2.Kafka是一个分布式消息队列.Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer ...
- PyTorch 1.4 中文文档校对活动正式启动 | ApacheCN
一如既往,PyTorch 1.4 中文文档校对活动启动了! 认领须知 请您勇敢地去翻译和改进翻译.虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错--在大部分情况下,我们的 ...