关于await又理解深一点了,以前有点懵,
原来await 是对Task.Run的一个修饰,叶节点,后续技节点是对标有async的方法进行串烧修饰,所以根在Task.Run这个方法要所以要理解await必须要详细查看Task.Run
Task.Run是调用后直接把Run的参数委托丢线程池的然后不等待直接返回的,所以返回是一个Task/Task<T>只有这两种情况加上await以后 就等待,然后直接取出Task<T>中的T了,这中间的各种可能的隐藏操作被底层编译器,运行时等代替了,比如线程上下文切换等。
要注意其实在实际场景中直接用Task.Run而不加await的情况才是异步的核心需求,异步的意思是同时做不等待。所以只有让很多Task同时开始调用的时候才有价值。
所以在同步调用方调用async方法时,最终还得用.Wait()/Result两种方式对其进行调用,从这里可以看出await其实是在异步线程池上进行的等待。因为现在有很多异步调用终端比如 webapi中的 Controller.Action方法比如 标记为async的Main方法都是异步调用终端所以不需要用上述方式切换回
同步主线程。
标签:异步,Task,Run,C#,await,调用,线程,理解 From: https://www.cnblogs.com/ProjectDD/p/17998687