async await的教程:https://www.cnblogs.com/zhaoshujie/p/11192036.html

异步方法:

        private async Task<string> TestAsync()
{
Console.WriteLine("异步方法开始");
var task = Task.Run(() =>
{
Thread.Sleep();
Console.WriteLine("在新线程中");
return "新线程结束";
}); var result = await task;
Console.WriteLine("异步方法结束"); return result;
}

调用时不使用await

        public IActionResult Index()
{
Console.WriteLine("主线程开始");
Console.WriteLine("输出结果:" + TestAsync());
Console.WriteLine("主线程结束");
}

结果:

1、主线程+异步方法内await之前的代码按顺序执行

2、await开始(开新线程)

3、跳出异步方法(不等待),继续执行主线程后续代码,此时Console.WriteLine("输出结果:" + TestAsync());拿不到TestAsync()的值

4、异步方法await执行结束后,异步方法await后的代码继续执行


调用时使用await

        public async Task<IActionResult> Index()
{
Console.WriteLine("主线程开始");
Console.WriteLine("输出结果:" + await TestAsync());
Console.WriteLine("主线程结束");
}

结果:

全部按顺序执行,可以正确拿到返回值


async await在winform中的优点是,不卡主线程,并且执行顺序不混乱,但在MVC作用有限,因为web主不结束界面总是无响应的

在MVC中,如果有一种需求,如微信支付后台的交易记录打包下载,在这种需求时,打包下载功能耗时较长,此时我们希望网页不等待打包完成,只起到“打包中,稍后查看”的提示作用,那么就可以:

        private Task BagAsync()
{
var task = Task.Run(() =>
{
Console.WriteLine("打包开始");
Thread.Sleep();
Console.WriteLine("打包结束");
}); return task;
} public IActionResult Index()
{
Console.WriteLine("准备打包");
BagAsync();
Console.WriteLine("后台打包中,请稍后查看。");
}

结果:

如果以后,我们又想等打包结束以后,再显示结果,我们可以在主方法中加入await等待就行,这样一个打包方法,可以根据调用者的意愿,随时等待或不等待:

        private Task BagAsync()
{
var task = Task.Run(() =>
{
Console.WriteLine("打包开始");
Thread.Sleep();
Console.WriteLine("打包结束");
}); return task;
} public async Task<IActionResult> Index()
{
Console.WriteLine("准备打包");
await BagAsync();
Console.WriteLine("打包成功。");
}

结果:

由于BagAsync()方法没有标记async,所以他本身没有await功能,所以在BagAsync方法编写时,在Task.Run之后的方法,将不会等待,一定注意执行顺序!可手动等待。

为什么BagAsync不标记async呢?是因为标记了async,但是我们的需是不想等待时,那么vs编译器,将会有一个提醒,当然,你也可不理它,但总是觉得比较烦。

被调用的异步方法在编写时,不一定非得要async,也可以只是一个普通的Task方法,由主调用方法来决定是否需要等待。

如果一个方法没有使用await,直接调用了一个普通的异步方法(无async标记),那么不会有警告,也不影响执行。

如果一个方法没有使用await,直接调用了一个标记了async的异步方法,那么这个方法本身无需标记async,编译器会有警告,但不影响执行。

如果一个方法使用await,来调用一个标记了async的异步方法或普通异步方法,那么这个方法也需要标记成async,否则无法通过。

如果一个异步方法本身标记了async,代码里却没有await编译器会有的提示,但不影响执行。

如果我们的异步方法没有返回值,并在异步方法内不需要等待,则可以不写成async,否则会在调用时时常会有警告,令人不爽。

如果我们的异步方法拥有返回值,或在异步方法内需要等待,则可以写成async,否则无法使用await,提升编码复杂度。

async本身是一个语法糖,请灵活使用

关于async await的测试的更多相关文章

  1. 测试Promise与Async/await的基本使用

    想在项目中用, 发现自己不是很熟 promise基本使用 基本使用-思路 new Promise()返回了一个状态机 一个完全无法被外界影响的状态机 构造函数, 传入一个函数, 两个参数, 分别是re ...

  2. [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程

    怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html  ...

  3. ASP.NET 中的 Async/Await 简介

    本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...

  4. [C#] .NET4.0中使用4.5中的 async/await 功能实现异

    好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...

  5. ASP.NET 上的 Async/Await 简介

    原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述, ...

  6. Python PEP 492 中文翻译——协程与async/await语法

    原文标题:PEP 0492 -- Coroutines with async and await syntax 原文链接:https://www.python.org/dev/peps/pep-049 ...

  7. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  8. .NET通过async/await实现并行

    如果可以并行可以大大提高性能,但在我们的使用中,不可能全是并行的也是要有线行操作,所以我们需要在业务逻辑层进行并行操作的护展: 数据访问层不变还是以前一样如下: public class UserDA ...

  9. async/await的实质理解

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

随机推荐

  1. 面试官:讲讲mysql表设计要注意啥

    内容时参考一个博主的,内容写的很好,就忍不住拿过来了,如遇到,请见谅 参考连接:https://www.cnblogs.com/rjzheng/p/11174714.html

  2. Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  3. 013——C# chart控件时间作为X轴(附教程)

    (一)参考文献:C#之Chart控件系列教程——一 (二)下载地址:https://download.csdn.net/download/xiaoguoge11/11838944 (三)视频教程:ht ...

  4. spring中少用的注解@primary解析

    这次看下spring中少见的注解@primary注解,例子 @Component public class MetalSinger implements Singer{ @Override publi ...

  5. RabbitMQ的安装和管理

    c:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.5.1\sbin>------------------------------- ...

  6. RESTFUL API 安全认证方式

    一般基于REST API 安全设计常用方式有: HTTP Basic Basic admin:admin Basic YWRtaW46YWRtaW4= Authorization: Basic YWR ...

  7. 服务器之select

    select select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 解决1024以下客户端时使用select ...

  8. (转)实验文档5:企业级kubernetes容器云自动化运维平台

    部署对象式存储minio 运维主机HDSS7-200.host.com上: 准备docker镜像 镜像下载地址 复制 12345678910111213141516 [root@hdss7-200 ~ ...

  9. HTTP状态码和支持的方法

    1. HTTP常用状态码   200 ok 客户端请求成功 400 bad request 客户端请求有语法错误,不能被服务器所理解 401 unauthorized 请求要求身份验证,对于登录后请求 ...

  10. 在CentOS7中安装zookeeper

    参考:https://www.linuxidc.com/Linux/2016-09/135052.htm 1.zookeeper运行需要jdk环境,先确保有配置jdk,可以参考此处 2.下载解压zoo ...