.Net Task的用法(二)async和await

先上一段代码

static void Main(string[] args)
{
    Console.WriteLine("1");

    var task = Test();

    Console.WriteLine("4");
    Thread.Sleep(1000);

    Console.WriteLine("5");

    task.Wait();
    Console.WriteLine("7");
    Console.ReadKey();
}

static async Task Test()
{
    //主线程
    Console.WriteLine("2");
    //主线程
    await GetName();

    Console.WriteLine("6");
}

static async Task GetName()
{
    Console.WriteLine("3");

    ///开新线程
    await Task.Run(() =>
    {
        Thread.Sleep(1000 * 5);
        Console.WriteLine("5 new");
    });

}
  1. 主线程中打印1,调用方法Test() 返回一个Task
  2. 主线程执行Test中方法 打印2,通过await 关键字等待GetName()方法执行完成
  3. 主线程执行GetName中的方法 打印3,之后主线程开启新的线程执行业务逻辑
  4. Main 方法中休眠1秒后打印4(因为打印4 之前并没有要求task 变量的 返回值或者等待,所有打印4的操作和新线程中的业务处理是同步的)
  5. 新线程中业务处理完成,Test中的await 通过,所有打印5
  6. 由于打印6之前要求了task 变量等待,所以当Test 执行完成后打印6

简单的理解就是 await 就是等待async 方法执行完成,async方法里面总能找到新开的线程

await并不是针对于async的方法,而是针对async方法所返回给我们的Task,这也是为什么所有的async方法都必须返回给我们Task。所以我们同样可以在Task前面也加上await关键字,这样做实际上是告诉编译器我需要等这个Task的返回值或者等这个Task执行完毕之后才能继续往下走。

posted @ 2019-01-25 10:05  Pen丶  阅读(2394)  评论(0编辑  收藏  举报