C# await 高级用法( 二 )


等待和不等待的区别虽然很多时候从原理上看,等待和不等待只是调用时机的问题 。但是依旧遇到一些小伙伴一直以为全部的异步方法都需要await,看到我写了没有直接await的代码觉得很诡异,所以我在这里做个实验给大家看 。
下面的代码是最常见的代码,在 async Task 的方法使用 await ,这样就会等待这个方法完成,代码就和同步代码一样 。
await GagarLerecel();private static async Task GagarLerecel()例如我这样写
await GagarLerecel();private static async Task GagarLerecel(){Write("GagarLerecel 开始");await Task.Delay(100);Write("GagarLerecel 完成");}输出就是按照顺序输出
【C# await 高级用法】GagarLerecel 开始GagarLerecel 完成如果我修改一下代码,创建一个新的函数 CoujafuDarso 里面的代码和上面函数相同
private static async Task CoujafuDarso(){Write("CoujafuDarso开始");await Task.Delay(100);Write("CoujafuDarso结束");}但是不在调用 CoujafuDarso 使用 await ,而是使用一个变量
var aa = CoujafuDarso();Write("其他代码");await aa;就是这样的代码,我的小伙伴说,这样写不清真,实际上这样写也是清真的代码 。在调用 CoujafuDarso 会在代码到第一个 await 函数就返回,于是先执行了CoujafuDarso开始,然后函数返回,执行Write("其他代码"),在最后await aa才等待函数把所有代码执行完成 。所以可以看到下面输出
CoujafuDarso开始其他代码CoujafuDarso结束但是不加 await 的呢?也就是函数一直都没有等待,我再写一个函数BotujawWorpay
private static async Task BotujawWorpay(){Write("BotujawWorpay开始");await Task.Delay(100);Write("BotujawWorpay结束");}调用的时候没有等待
BotujawWorpay();Write("CesearJemmeme");这时会在输出CesearJemmeme之后,某个时间继续执行函数
BotujawWorpay开始CesearJemmemeBotujawWorpay结束这样和使用 void 函数有什么区别?
在执行的函数遇到第一个 await 就会返回,这样就可以继续执行函数下面的代码

C# await 高级用法

文章插图
 
输出下面代码
德熙逗比代码BarpooseewhowGelpousacall 代码1 线程1德熙逗比状态开始BarpooseewhowGelpousacall 代码2 线程5BarpooseewhowGelpousacall 代码3 线程4BarpooseewhowGelpousacall 完成 线程5多线程不是所有的 await 都会开多线程,如下面的代码
static void Main(string[] args){Write("开始");Write("线程" + Thread.CurrentThread.ManagedThreadId);CeaXisci();Task.Run(async () =>{await Task.Delay(1000);MouvaypuNasjo();});while (true){Console.Read();}}private static async Task BarpooseewhowGelpousacall(){Write("BarpooseewhowGelpousacall 代码1 线程" + Thread.CurrentThread.ManagedThreadId);await Task.Delay(10);Write("BarpooseewhowGelpousacall 代码2 线程" + Thread.CurrentThread.ManagedThreadId);await Task.Delay(10);Write("BarpooseewhowGelpousacall 完成 线程" + Thread.CurrentThread.ManagedThreadId);}也就是在没有Task.Delay分开的代码,只要使用了 await 那么就可以在同个线程运行,请看输出 。在最后的BarpooseewhowGelpousacall 完成和这个函数后面的代码都在同一个线程运行,而上面的代码,可能是在同个线程,也可能在不同的线程
开始线程1CeaXisci 开始 线程1BarpooseewhowGelpousacall 代码1 线程1BarpooseewhowGelpousacall 代码2 线程5BarpooseewhowGelpousacall 完成 线程4CeaXisci 开始 完成4本文会经常更新,请阅读原文:
https://blog.lindexi.com/post/C-await-%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验 。




推荐阅读