async/await关键字能帮助开发者更容易地编写异步代码。但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用。本文就async/await的实质作简单描述,以便大家能更清楚理解。

一、async的实质

async的实质是告诉调用者,async标记的方法可能包含异步代码。具体来说,以wait以分界点,async标记的方法被分为三个片段:

static async void TestAsyncMethod()
{
someCode1(); //片段1
await Thask.Run(...); //片段2
comeCode3(); //片段3
}
  • 代码片段1与调用者同属一个线程,属同步代码。
  • 代码片段2表示await引起的异步代码,另起一个线程。
  • 代码片段3在await之后,表示该异步代码后的回调代码。

这3个代码片段顺序固定,但均不要求一定出现。

二、await的实质

await一定出现在async标记的代码中,表示后面挂起一段线程代码,而await异步代码后在代码均表示回调代码。代码示意如下:

await 异步代码;
回调代码;

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());
Console.WriteLine("Test3");
}

输出结果:

Test2
Test3
Test1

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());
return "Tao";
}));
Console.WriteLine("Test5");
}

输出结果:

Test4
Test1
Tao
Test5

async/await的实质理解的更多相关文章

  1. async await 的 实质 本质

    async await  的 实质 就是 用 “状态机” 来 取代 函数层层调用 . async await  的 本质 是 语法糖,  和 提高性能 什么的 没什么关系 . 为了避免理解歧义, 我把 ...

  2. Promise, Generator, async/await的渐进理解

    作为前端开发者的伙伴们,肯定对Promise,Generator,async/await非常熟悉不过了.Promise绝对是烂记于心,而async/await却让使大伙们感觉到爽(原来异步可以这么简单 ...

  3. Promise 和async/await 的使用理解

    Promise 和async/await 的使用理解 1. new Promise时就会开始执行语句. new Promise(resolve => resolove('成功信息') )     ...

  4. .Net异步关键字async/await的最终理解

    由于之前的项目中自己突然想试试异步action,于是使用了一下,突然就对异步action的执行流程以及原理及其好处产生了兴趣,再参考了一些文章之后,就做了下归类. 我们可以不需要太深入的理解底层,但是 ...

  5. ES7的Async/Await的简单理解

    Async/Await 的个人见解 正文: async,顾名思义,一个异步执行的功能,而 await 则是配合 async 使用的另一个关键字,也是闻字识其意,就是叫你等待啦! 二者配合食用效果更佳哦 ...

  6. js异步编程终级解决方案 async/await

      在最新的ES7(ES2017)中提出的前端异步特性:async.await. async.await是什么 async顾名思义是“异步”的意思,async用于声明一个函数是异步的.而await从字 ...

  7. async/await 与 generator、co 的对比

    之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...

  8. js中回调函数,promise 以及 async/await 的对比用法 对比!!!

    在编程项目中,我们常需要用到回调的做法来实现部分功能,那么在js中我们有哪些方法来实现回调的? 方法1:回调函数 首先要定义这个函数,然后才能利用回调函数来调用! login: function (f ...

  9. 从async await 报错Unexpected identifier 谈谈对上下文的理解

    原文首发地址: 先简单介绍下async await: async/await是ES6推出的异步处理方案,目的也很明确:更好的实现异步编程.   详细见阮大神 ES6入门 现在说说实践中遇到的问题:使用 ...

随机推荐

  1. 第二章 I - The 3n + 1 problem(2.4.2)

    这是一道很坑爹的题,一定注意输入的两个数的大小,并且不能简单的交换,因为在最后的输出的时候还需要将原来的数按照原来的顺序和大小,这就是为什么还得开辟两个值得原因 Description Problem ...

  2. convert NameValueCollection/Dictionary<string, object> to JSON string

    public static class WebExtension { public static T Decode<T>(this RequestBase res) { Type type ...

  3. OC基础(7)

    封装 继承基本概念 继承相关特性 多态基本概念 多态的实现 *:first-child { margin-top: 0 !important; } body > *:last-child { m ...

  4. Codeforces Round #219 (Div. 1) C. Watching Fireworks is Fun

    C. Watching Fireworks is Fun time limit per test 4 seconds memory limit per test 256 megabytes input ...

  5. Yii 中比较常用的rules验证规则记录

    查看代码   打印 01 return array( 02   03     //必须填写 04     array('email, username, password,agree,verifyPa ...

  6. 解决setInterval计时器不准的问题

    在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在s ...

  7. startup毕业论文

    今天起得相对比较晚,为的是一个没有目的面试,去了的结果.只是打击一下自己的自信心,走的时候,面试官冷冷的说了一句,你的面试到此结束,是的,我并没有很伤心,在门外等面试的时候,我就非常的后悔,今天是不该 ...

  8. Centos安装arm-linux-gcc等交叉工具链

    1.安装(仅以其中一个为例) 1.1 下载arm-linux-gcc (搜一下,很多的!) 1.2 解压:指定解压到根目录 tar xvzf arm-linux-gcc-4.4.3.tar.gz -C ...

  9. OpenJudge 取数游戏

    描述 我们来玩一个游戏:自然数1到N,按顺序列成一排,你可以从中取走任意个数,但是相邻的两个不可以同时被取走.如果你能算出一共有多少种取法,那么你会被天神Lijiganjun奖励. 输入 仅包含一个数 ...

  10. 解决问题 “You don't have permission to access /index.html on this server.”

    前几天装一个linux 企业版5.0安装了apache,打开测试页面的时候出现如下错误: Forbidden You don't have permission to access /index.ht ...