首页 > 学院 > 开发设计 > 正文

async和await浅析

2019-11-17 03:19:47
字体:
来源:转载
供稿:网友

async和await浅析

要理解async和await的用法,首先要了解Task相关知识,这里不做说明,因为这不是本文的重点。

如果你已经对Task很了解,那么如何使用async和await,在此主要总结了以下三点:

  1. 只有在async方法里面才能使用await操作符;
  2. await操作符是针对Task对象的;
  3. 当方法A调用方法B,方法B方法体内又通过await调用方法C时,如果方法C内部有异步操作,则方法B会等待异步操作执行完,才往下执行;但方法A可以继续往下执行,不用再等待B方法执行完。

对于第三点说的有点绕,所以下面结合代码说一下:

        static void Main(string[] args)        {            Test();            Console.WriteLine("Test End!");            Console.ReadLine();        }        static async void Test()        {            await Test1();            Console.WriteLine("Test1 End!");        }        static Task Test1()        {            Thread.Sleep(1000);            Console.WriteLine("create task in test1");            return Task.Run(() =>            {                Thread.Sleep(3000);                Console.WriteLine("Test1");            });        }

执行结果:

对结果解释是:

  Main方法调用具有async标示的Test方法,Test方法通过await调用Test1方法,当执行顺序执行到Test1时,遇到里面的异步操作;则Test方法会等待Test1里面的异步操作执行完再往下执行;但是Main方法,不用再等待Test方法执行,可以继续往下执行。


对于上面情况,可以不使用async和await也能实现,代码如下:

        static void Main(string[] args)        {            Test();            Console.WriteLine("Test End!");            Console.ReadLine();        }        static void Test()        {            var test1=Test1();            Task.Run(() =>            {                test1.Wait();                Console.WriteLine("Test1 End!");            });        }        static Task Test1()        {            Thread.Sleep(1000);            Console.WriteLine("create task in test1");            return Task.Run(() =>            {                Thread.Sleep(3000);                Console.WriteLine("Test1");            });        }


最后:这是我个人的理解和总结,欢迎大家来讨论或指教


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表