async 和await深入理解

1、await 运算符应用于异步方法中的任务,在方法的执行中插入挂起点,直到所等待的任务完成。
任务表示正在进行的工作。
2、await 可用于由 async 关键字修改的异步方法中。
使用 async 修饰符定义并且通常包含一个或多个 await 表达式的这类方法称为异步方法。
3、await 真正的目的只有一个 在调用异步方法 XXAsync() 时挂起此方法,它认为这个方法是比较耗时的方法,主线程或调用此方法的线程不要在此方法等待。
并同时作个标记,当前执行的线程运行结束时,将由此处恢复运行,所以在await 标记的异步方法下面的代码或方法将不能运行,必须等待这个方法完成!
4、加不加 await 与 方法是异步还是同步的并没有关系
下面写个例子讲述

 private static async Task XAsync()
  {            
     await  XXAsync();
     OtherMothod();   
  }

5、在运行至 await XXAsync()时,调用方法XAsync()者将不再运行,直接返回,就像我们程序代码中的return语句。这样做的好处是,调用线程,不将等待此耗时线程。直接让调用线程往下运行,
6、如果调用线程向上一直存在await 链,就像方法套方法里有return一样,会逐层向上返回,一直返回到主线程,而每个“子线程”去等待耗时的I/O处理,比如 操作数据库和网络流
7、我们即要多线程或多任务执行我们的程序,让耗时的任务得到执行,同时又要给调用者快速响应,不管他有没有完成任务! 这才是真正的目的。

private static async TaskXAsync()
  {
           
    await  XXAsync();

    await  XXXAsync(); 
  }

XXXAsync()必须等待XXAsync()方法执行结束!此时不会影响调用者的响应速度,但会影响我们代码的执行效率,这点和两个同步方法稍有区别

private static async TaskXAsync()
  {
           
    XX();

    XXX(); 
  }

像上面的例子XX()和XXX()两同步方法,不仅按顺序执行,而且调用者也无法拿回调用权,也就是无法及时响应,必须待两个方法都结束为止。

猜你喜欢

转载自blog.csdn.net/weixin_44007644/article/details/87720940
今日推荐