要了解async和await的用法,首先要了解task的相关知识,这里就不解释了,因为这不是本文的重点。
假如你已经很了解Task了,那么如何使用async和await,这里主要总结了以下三点:
- await操作符只能在async方法中使用;
- await操作符是针对task对象的;
- 当方法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); }); }