async await

Async

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

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

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

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

Await

后面紧跟一个Task

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

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

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

 

Task.Run(()=>{

}) 

 

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

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);
        }

  进程:占有资源最小单元

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

 

posted on 2019-07-11 10:07  dollymi  阅读(307)  评论(0编辑  收藏  举报

导航