回顾C#5.0是如何进行异步编程的
static void Main(string[] args) { string url = "https://docs.microsoft.com/zh-cn/dotnet/core/api/system"; Task task = WriteWebRequestSizeAsync(url); var x = task.IsCompleted; while (!task.Wait(100)) { Console.Write("."); } } static async Task WriteWebRequestSizeAsync(string url) { try { WebRequest request = WebRequest.Create(url); WebResponse response = await request.GetResponseAsync(); using (var reader = new StreamReader(response.GetResponseStream())) { string text = await reader.ReadToEndAsync(); Console.WriteLine(FormatBytes(text.Length)); } } catch (WebException) { } //省略部分Catch块 }
这个代码在上一篇同步VS异步中也有的 http://www.cnblogs.com/cheesebar/p/6553310.html
上一篇着重记录了基于C#5.0之前是如何进行异步编程的,这里就在探讨一下async和await
首先去掉async
1.这里表明标记为 async 的方法为异步方法
2.await只能在异步方法中使用,并且await后面方法返回值必须为Task或者Task<Result>
现在去掉await(保留async)并把方法改为同步
1.这里表明单有async没有await操作符的方法将以同步方式运行(好吧是都写着呢)
问题:async标记的方法(并且使用了await),那么它总是异步执行的吗
实际上,在调用方法内部的异步操作之前,它总是以同步执行的,可以和TPL(Task Parallel Library)执行过程相比较,await只是提供了一个异步操作的流程控制,async就是告诉编译器,这里我将可能会有异步方法的同步调用(await后面必须为一个异步方法,但在await的上下文环境中,它是阻塞的)
没有await会怎么样
static void Main(string[] args) { var task = Async一天(); while (!task.Wait(100)) { Console.Write("一天进行中..."); } Console.WriteLine("一天结束了..."); } static async Task Async一天() { Async七点(); Async八点(); Async十一点(); Async十八点(); } static Task Async七点() { Task task = Task.Run(() => { Console.WriteLine("七点起床..."); Thread.Sleep(1000); }); return task; } static Task Async八点() { Task task = Task.Run(() => { Console.WriteLine("八点上班..."); Thread.Sleep(1000); }); return task; } static Task Async十一点() { Task task = Task.Run(() => { Console.WriteLine("十一点吃午饭..."); Thread.Sleep(1000); }); return task; } static Task Async十八点() { Task task = Task.Run(() => { Console.WriteLine("十八点吃晚饭..."); Thread.Sleep(1000); }); return task; }
Ctrl+F5输出
await来控制异步方法的执行流程
修改一下Async一天方法
static async Task Async一天() { await Async七点(); await Async八点(); await Async十一点(); await Async十八点(); }