• async await


    Async

    标记一个方法为不会阻塞的版本,可以瞬间完成,在执行时瞬间返回一个任务

    C# 本身不会为其启动新线程,(协程,一个线程可以启动多个协程)

    几乎所有执行缓慢的方法都有async方法

    Async方法至少使用一次await关键字,遇到耗时任务,加上到await会交给控制权给父协程,父协程并监控协程的完成,当完成了控制权转回来,执行后面的代码

    Await

    后面紧跟一个Task

    同步等待该任务的完成,并获取到其返回值

    Await后面的代码仍由原来的线程完成的

    Await后面的Task会等待但不会阻塞

    Task.Run(()=>{

    }) 

    在javascript里,asyncawait底层是使用协程和微服务应用,协程是用户态的,由程序进行控制,一个线程可以创建多个协程,父协程和协程是交替进行。

    async方法,异步执行和隐式返回 Promise。

    创建一个协程,启动协程,javascript会保存当前调用栈等信息,执行协程的信息

    执行到await信息,后面紧跟一个promise对象,executor函数调用了resolve函数,将此任务交给微任务队列

    暂停当前协程,将控制权交给父协程,调用promise.then方法监控状态改变,继续执行后面方法,结合之前检查微服务队列,触发then函数,回调函数激活后,控制权交回协程,同时将value值传给该协程。

    foo协程激活之后,会把刚才的value值赋给了变量a,然后foo协程继续执行后续语句,执行完成之后,将控制权归还给父协程。

    以上就是await/async的执行流程。正是因为async和await在背后为我们做了大量的工作,所以我们才能用同步的方式写出异步代码来。

     

    使用AsyncHelper在同步代码里面调用异步 

     /// <summary>
            /// Runs a async method synchronously.
            /// </summary>
            /// <param name="func">A function that returns a result</param>
            /// <typeparam name="TResult">Result type</typeparam>
            /// <returns>Result of the async operation</returns>
            public static TResult RunSync<TResult>(Func<Task<TResult>> func)
            {
                return AsyncContext.Run(func);
            }
    
            /// <summary>
            /// Runs a async method synchronously.
            /// </summary>
            /// <param name="action">An async action</param>
            public static void RunSync(Func<Task> action)
            {
                AsyncContext.Run(action);
            }
    

      进程:占有资源最小单元

            线程:调度运算的最小单元

  • 相关阅读:
    PIE SDK 基于Dot net bar实现比例尺控件
    PIE SDK 监督分类对话框类(SupervisedClassificaitonDialog)使用经验
    图层树右键菜单结合Command操作过程
    PIE 插件式开发小笔记__PIESDK学习体会
    [转]sqlserver收缩文件没效果的解决办法
    efcore 输出显示sql语句
    Linux 常见的进程调度算法
    Linux 配置 vimrc
    排序 选择排序&&堆排序
    C/C++ 内存管理 (《高质量C++》-- 整理笔记)
  • 原文地址:https://www.cnblogs.com/cloudsu/p/11168301.html
Copyright © 2020-2023  润新知