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. Rolling Cursor Invalidations with DBMS_STATS.AUTO_INVALIDATE (文档 ID 557661.1)

      Rolling Cursor Invalidations with DBMS_STATS.AUTO_INVALIDATE (文档 ID 557661.1) 转到底部 In this Documen ...

  2. A手机等的网络udp广播,收到广播以后回复udp消息

    B手机:向A手机发送一条消息,等待A回复 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: ...

  3. java内省机制Introspector

    访问JavaBean属性的两种方式 1)直接调用bean的setXXX或getXXX方法: 2)通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式: a)通过P ...

  4. 使用pscp实现Windows 和 Linux服务器间远程拷贝文件

    转自:http://www.linuxidc.com/Linux/2012-05/60966.htm 在工作中,每次部署应用时都需要从本机Windows服务器拷贝文件到Linux上,有时还将Linux ...

  5. 使用python通过selenium模拟打开chrome窗口报错 出现 "您使用的是不受支持的命令行标记:--ignore-certificate-errors

    #在程序前加上这段代码 from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimen ...

  6. Flex 三态复选框

    在周末挤出了一点时间,写了一个三态复选框的组件,单独使用没有价值,不过集成到树之中可以很好的实现三态树,今天上午便把三态树组件也完成了,Flex自定义组件基本无所不能,此组件基于最新的Flex4.6( ...

  7. 慕课网-安卓工程师初养成-4-6 Java条件语句之 switch

    来源:http://www.imooc.com/code/1358 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本 ...

  8. c#中如何得到百分比数值

    //此方法得到的百分比后小数太多,不行double percent=Convert.ToDouble(2)/Convert.ToDouble(34);string result=(percent*10 ...

  9. c# 利用 两个TREEVIEW控件完成TEENODE的鼠标拖动操作

    功能说明: 我们有两个TREEVIEW控件——TREEVIEW1,TREEVIEW2.Treeview1内有三个NODE,Treeview2内有三个NODE.将Treeview1内的NODE拖动到Tr ...

  10. 【C++面试】常考题复习:排序算法

    // Sort.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> /*********** ...