原理

与同步函数相比,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异步函数原理的更多相关文章

  1. async/await 异步编程(转载)

    转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...

  2. async/await 异步编程

    前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在 ...

  3. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  4. 将 async/await 异步代码转换为安全的不会死锁的同步代码

    在 async/await 异步模型(即 TAP Task-based Asynchronous Pattern)出现以前,有大量的同步代码存在于代码库中,以至于这些代码全部迁移到 async/awa ...

  5. C#中 Thread,Task,Async/Await 异步编程

    什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...

  6. async/await异步处理demo

    async/await异步处理demo 下载地址: async/await异步处理demo

  7. 【转】C# Async/Await 异步编程中的最佳做法

    Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...

  8. 深入理解协程(四):async/await异步爬虫实战

    本文目录: 同步方式爬取博客标题 async/await异步爬取博客标题 本片为深入理解协程系列文章的补充. 你将会在从本文中了解到:async/await如何运用的实际的爬虫中. 案例 从CSDN上 ...

  9. .NET Web应用中为什么要使用async/await异步编程

    前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...

随机推荐

  1. CentOS查看内核版本,位数,版本号 (zhuan)

    http://blog.csdn.net/painsonline/article/details/7668824 ******************************************* ...

  2. OpenGL的glTranslatef平移变换函数详解

    OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先 ...

  3. Struts2文件上传

    1  在Struts2中上传文件需要 commons-fileupload-1.2.1.jar.commons-io-1.3.2.jar 这两个包. 2  确认页面form表单上的提交方式为POST, ...

  4. Sqlerver_各类函数

    SQL Aggregate 函数 SQL Aggregate 函数计算从列中取得的值,返回一个单一的值. 有用的 Aggregate 函数: AVG() - 返回平均值-SELECT AVG(colu ...

  5. iOS开发 Date转字符串

    + (NSString *)formatterDate:(NSNumber *)desDate WithDateFormatter:(NSString *)formatter{ NSDateForma ...

  6. phalcon: tasks MainTask.php命令行工具

    phalcon: tasks MainTask.php命令行工具 tasks MainTask.php 一般用来做计划任务,处理比较复杂的大型的数据.然后其他功能或程序才能更简单的读取这些复杂的数据. ...

  7. 堆排序(C语言)

    #ifndef HEAP_SORT_H #define HEAP_SROT_H #include<iostream> void maxHeap(int *arr,unsigned int ...

  8. virtualBox虚拟机安装与主机互访和实现上网配置

    1.到官方网下载vitualBox虚拟机,目前最新版本5.0,并安装. https://www.virtualbox.org/ 2.下载安装CentOS系统安装文件 本文采用CentOS-6.5-i3 ...

  9. Spring AOP propagation七种属性值

    <!-- 配置事务通知 --> <tx:advice id="advice" transaction-manager="transactionManag ...

  10. Cmd Markdown 简明语法手册

    『Cmd 技术渲染的沙箱页面,点击此处编写自己的文档』 Cmd Markdown 简明语法手册 标签: Cmd-Markdown 1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体. 示例: 这是 ...