async/await的实质理解 async/await关键字能帮助开发者更容易地编写异步代码。但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用。本文就async/await的实质作简单描述,以便大家能更清楚理解。
一、async的实质 async的实质是告诉调用者,async标记的方法可能包含异步代码。具体来说,以wait以分界点,async标记的方法被分为三个片段:
static async void TestAsyncMethod(){ someCode1(); //片段1 await Thask.Run(...); //片段2 comeCode3(); //片段3}
View Code代码片段1与调用者同属一个线程,属同步代码。代码片段2表示await引起的异步代码,另起一个线程。代码片段3在await之后,表示该异步代码后的回调代码。 这3个代码片段顺序固定,但均不要求一定出现。
二、await的实质 await一定出现在async标记的代码中,表示后面挂起一段线程代码,而await异步代码后在代码均表示回调代码。代码示意如下:
await 异步代码;回调代码;
View Code await挂起的异步代码通常有3种情况:
await后调用async标记的方法await Task.Run(...);await Task<TResult>.Run(...); 三、代码示例 1、async中只有同步代码 代码:
static void Main(string[] args) { Console.Title = "Async/Await测试"; MyAsync1(); Console.WriteLine("Test1"); Console.ReadLine(); } static async void MyAsync1() { Console.WriteLine("Test2"); Thread.Sleep(TimeSpan.FromSeconds(2)); Console.WriteLine("Test3"); }
View Code 输出结果:
Test2Test3Test1
2、async中含有异步代码 代码:
static void Main(string[] args) { Console.Title = "Async/Await测试"; MyAsync2(); Console.WriteLine("Test1"); Console.ReadLine(); } static async void MyAsync2() { Console.WriteLine("Test4"); Console.WriteLine(await Task<string>.Run(() => { Thread.Sleep(TimeSpan.FromSeconds(2)); return "Tao"; })); Console.WriteLine("Test5"); }
View Code 输出结果:
Test4Test1TaoTest5