C# Async/Await异步函数原理
来源:互联网 发布:java sleep使用 编辑:程序博客网 时间:2024/05/01 11:40
原理
与同步函数相比,CLR在执行异步函数时有几个不同的特点:
1. 并非一次完成,而且分多次完成
2. 并非由同一个线程完成,而是线程池每次动态分配一个线程来处理;
结合这些特点,C#编译器将异步函数转换为一个状态机结构。这种结构能挂起和恢复。它的执行方式是一种工作流的方式。
执行步骤
1. CLR创建一个状态机,这个状态机的操作数默认值为-1。
2. 开始执行状态机
3. 状态机通过操作数来选定执行路径
4. 状态机调用GetAwaiter方法来获取一个等待者对象awaiter,它的类型为TaskAwaiter<T>
5. 状态机获取awaiter后,查询其IsCompleted属性。
6. 若IsCompleted为True,则操作已经以同步方式完成,状态机继续执行以处理结果。
7. 若IsCompleted为False,则操作将以异步方式来完成,状态机调用awaiter的OnCompleted方法并向它传递一个委托(引用状态机的MoveNext来实现工作流状态的变迁)。这时状态机允许线程返回原地以执行其它代码。
8. 将来某个时候,awaiter会在完成时调用委托以执行MoveNext,这时可根据状态机中的字段知道如何到达代码中的正确位置,使方法能够从它当初离开的位置继续。
9. 调用awaiter的GetResult方法获取结果,并进行处理。
10. 状态机执行完毕后,垃圾回收器会回收任何内存。
限制
1. 应用程序的Main方法不能转变成异步函数
2. 构造函数、属性、事件不能转变成异步函数
3. 不能在catch、finally、unsafe块中使用await操作符
4. 不能在支持线程锁中使用await操作符
5. Linq中,只能在from子句的第一个集合表达式或join子句的集合表达式中使用await操作符。
- C# Async/Await异步函数原理
- async/await 异步函数
- async/await 异步函数
- C#异步编程async await
- ES2017 异步函数async/await
- Async和Await异步编程的原理
- Async和Await异步编程的原理
- c# async、await的使用,异步方法
- C# Async/await 异步多线程编程
- C#异步编程之async、await
- 初识C#异步编程Task,await,async
- C#中的异步:async和await
- C#中的异步:async和await
- C#中的异步:async和await
- C#异步编程和await/async
- c# 异步编程(async + await + HttpClient)
- ES7 异步函数 (async await)
- async/await 异步编程
- 生活小感悟
- POJ 1149 (网络流,有趣的建图)
- npm配置淘宝镜像仓库以及electron镜像
- Oracle 创建视图、创建存储过程
- 小甲鱼PE详解之输入表(导出表)详解(PE详解09)
- C# Async/Await异步函数原理
- OSG学习:LOD、数据分页、动态调度
- 优化网页速度的7种方法
- 【异常】Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
- JS学习(12)----events
- codeforces 816D Karen and Test(数学)
- C++精进篇继承及经典示例
- 如何把字符串写入SD卡文件中,如何读取SD卡文件的数据
- SparkSQL 操作 Json 格式数据