zoukankan      html  css  js  c++  java
  • C# Async/Await异步函数原理

    原理

    与同步函数相比,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操作符。

  • 相关阅读:
    Asp.Net MVC 常用开发方式之EF Code First
    整理一下Entity Framework的查询
    C#中yield return用法分析
    SQL Server表和字段说明的增加和更新
    C#中一个问号和两个问号(a ?? b)的作用
    你应该知道的25道Javascript面试题
    ASP.NET Core Razor 页面路由
    ASP.NET Core MVC – Tag Helper 组件
    ASP.NET Core 防止跨站请求伪造(XSRF/CSRF)攻击
    ASP.NET Core 使用Cookie验证身份
  • 原文地址:https://www.cnblogs.com/markhe/p/5587958.html
Copyright © 2011-2022 走看看