博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再谈async与await
阅读量:4593 次
发布时间:2019-06-09

本文共 2241 字,大约阅读时间需要 7 分钟。

回顾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十八点();}

 

转载于:https://www.cnblogs.com/cheesebar/p/6554084.html

你可能感兴趣的文章
2-8
查看>>
C# 可空值类型
查看>>
JVM介绍
查看>>
Java中this关键字在构造方法中的使用
查看>>
使用vue-router进行页面切换时滚动条位置与滚动监听事件
查看>>
UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理
查看>>
51Nod 1089 最长回文子串 V2 —— Manacher算法
查看>>
$.ajax()方法详解
查看>>
Python基础之函数二
查看>>
null和undefined区别
查看>>
Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总
查看>>
软件测试工具
查看>>
input text 的事件及方法
查看>>
(转载)Android之有效防止按钮多次重复点击的方法(必看篇)
查看>>
简单多线程拷贝单文件v2.1
查看>>
2015.5.11站立会议
查看>>
Oracle PL/SQL编程之过程
查看>>
Spring(三)--Spring bean的生命周期
查看>>
TextClock的基本使用
查看>>
.NET技术
查看>>