.net异步编程中async 和await深入理解

发布时间 2023-03-25 13:26:08作者: 桃花雪
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、我们即要多线程或多任务执行我们的程序,让耗时的任务得到执行,同时又要给调用者快速响应,不管他有没有完成任务! 这才是真正的目的。
 

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

private static async TaskXAsync()
  {
           
    XX();

    XXX();
  }

 



 

像上面的例子XX()和XXX()两同步方法,不仅按顺序执行,而且调用者也无法拿回调用权,也就是无法及时响应,必须待两个方法都结束为止。
笔记:关于异步编程
使用异步编程,方法调用时在后台运行(通常在线程活任务的帮助下),并且不会阻塞调用线程。


async和await只是一个标记

 
static void Main(string[] args)

{

    Task.Run(() =>                                          //异步开始执行

    {

        Thread.Sleep(1000);                                 //异步执行一些任务

        Console.WriteLine("Hello World");                   //异步执行完成标记

    });

    Thread.Sleep(1100);                                     //主线程在执行一些任务

    Console.WriteLine("Main Thread");                       //主线程完成标记

    Console.ReadLine();

}

 



  发现执行结果是:

  这个很正常。但是我们希望先执行主线程完成标记,不改动主线程和Task的任务情况下,如何处理?

 

使用await和async

    
static void Main(string[] args)

{

    Say();                             //由于Main不能使用async标记

    Console.ReadLine();

}

private async static void Say()

{

    var t = TestAsync();

    Thread.Sleep(1100);                                     //主线程在执行一些任务

    Console.WriteLine("Main Thread");                       //主线程完成标记

    Console.WriteLine(await t);                             //await 主线程等待取异步返回结果

}

static async Task<string> TestAsync()

{

    return await Task.Run(() =>

    {

        Thread.Sleep(1000);                                 //异步执行一些任务

        return "Hello World";                               //异步执行完成标记

    });

}

  1.凡是使用await关键字的方法,都必须打上async标记。

  2.async表示方法内有异步方法,调用async方法,会立刻另起线程执行。

  3.await只是显示等待线程结束。await表示等待异步方法执行完,并取返回值。