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); }
进程:占有资源最小单元
线程:调度运算的最小单元