关于async await的测试
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的测试的更多相关文章
- 测试Promise与Async/await的基本使用
想在项目中用, 发现自己不是很熟 promise基本使用 基本使用-思路 new Promise()返回了一个状态机 一个完全无法被外界影响的状态机 构造函数, 传入一个函数, 两个参数, 分别是re ...
- [.NET] 怎样使用 async & await 一步步将同步代码转换为异步编程
怎样使用 async & await 一步步将同步代码转换为异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/6079707.html ...
- ASP.NET 中的 Async/Await 简介
本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异
好东西需要分享 原文出自:http://www.itnose.net/detail/6091186.html 在.NET Framework 4.5中添加了新的异步操作库,但是在.NET Framew ...
- ASP.NET 上的 Async/Await 简介
原文链接 大多数有关 async/await 的在线资源假定您正在开发客户端应用程序,但在服务器上有 async 的位置吗?可以非常肯定地回答“有”.本文是对 ASP.NET 上异步请求的概念性概述, ...
- Python PEP 492 中文翻译——协程与async/await语法
原文标题:PEP 0492 -- Coroutines with async and await syntax 原文链接:https://www.python.org/dev/peps/pep-049 ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
- .NET通过async/await实现并行
如果可以并行可以大大提高性能,但在我们的使用中,不可能全是并行的也是要有线行操作,所以我们需要在业务逻辑层进行并行操作的护展: 数据访问层不变还是以前一样如下: public class UserDA ...
- async/await的实质理解
async/await关键字能帮助开发者更容易地编写异步代码.但不少开发者对于这两个关键字的使用比较困惑,不知道该怎么使用.本文就async/await的实质作简单描述,以便大家能更清楚理解. 一.a ...
随机推荐
- 基于jQuery制作的手风琴折叠菜单
初始化为全部隐藏 点第一个,显示第一个所隐藏的内容 当点第二个的时候,第一个的内容隐藏,第二个栏目的内容显示,以此类推 下面是代码部分 <!DOCTYPE html><html la ...
- docker(一) -- docker安装、容器加速、下载、备份
一.docker的 容器是从镜像中创建出来的虚拟实例 容器用来运行实例,是读写层 镜像用来安装程序,是只读层 1. docker的安装和基本操作 安装命令 yum -y update yum inst ...
- 06_Tutorial 6: ViewSets & Routers 视图集与路由器
1.Tutorial 6: ViewSets & Routers 视图集与路由器 0.文档 https://q1mi.github.io/Django-REST-framework-docum ...
- 008_Python3 列表
序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表 ...
- bzoj 3721: PA2014 Final Bazarek 贪心
如果没有限制,直接取前 $k$ 大即可. 有限制,则只有几种可能:奇换偶,偶换奇. 维护奇数偶数的前缀最小值和后缀最大值即可. code: #include <bits/stdc++.h> ...
- CRNN网络结构详解
目录 一. CRNN概论 简介 网络 二. CRNN局部之特征提取 三. CRNN局部之BLSTM 四. CRNN局部之CTC 关于CTC是什么东西? CTC理论基础 五. 参考文献 一. CRNN概 ...
- 使用开源软件 jumpserver 搭造自己的堡垒机
使用开源软件 jumpserver 搭造自己的堡垒机 开软地址:https://github.com/jumpserver/jumpserver 目前版本:1.5.2 测试的时候有少许BUG,但功能却 ...
- 在SpringMVC中操作Session、Request、Response对象
示例 @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper user ...
- Codeforces Round #566 (Div. 2)题解
时间\(9.05\)好评 A Filling Shapes 宽度为\(3\),不能横向填 考虑纵向填,长度为\(2\)为一块,填法有两种 如果长度为奇数则显然无解,否则\(2^{n/2}\) B Pl ...
- RK3288 查看ddr信息
转载请注明出处:https://www.cnblogs.com/lialong1st/p/10910949.html CPU:RK3288 系统:Android 5.1 1.查看ddr驱动版本号.容量 ...