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. rest_framework/api.html

    解决办法 在setting.py文件中添加 'rest_framework' 注册这个应用 INSTALLED_APPS = [ 'django.contrib.admin', 'django.con ...

  2. javaScript基础及初始面向对象

    对象是什么?对象是包含相关属性和方法的集合体属性方法什么是面向对象面向对象仅仅是一个概念或者编程思想通过一种叫做原型的方式来实现面向对象编程 创建对象自定义对象内置对象 自定义对象2-1基于Objec ...

  3. 58、springmvc-定制与接管SpringMVC

    58.springmvc-定制与接管SpringMVC 定制SpringMVC: 1).@EnableWebMvc:开启SpringMVC定制配置功能: <mvc:annotation-driv ...

  4. Spark RDD 到 LabelPoint的转换(包含构造临时数据的方法)

    题目: 将数据的某个特征作为label, 其他特征(或其他某几个特征)作为Feature, 转为LabelPoint 参考: http://www.it1352.com/220642.html 首先构 ...

  5. Ubuntu 18.04安装NVIDIA显卡驱动教程

            最近遇到了在Ubuntu 18.04上安装NVIDIA显卡驱动的情况,看到一篇教程讲解的很好,拿来收藏. 安装NVIDIA显卡驱动风险极大,新手注意. 在Ubuntu 18.04上安装 ...

  6. link cut tree 洞穴勘测

    /*[bzoj2049][Sdoi2008]Cave 洞穴勘测 2014年7月30日1,06923Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区 . ...

  7. tarjan模板完整版

    https://www.luogu.org/problem/P2863 #include<cstdio> #include<vector> using namespace st ...

  8. 代码 | 用ALNS框架求解一个TSP问题 - 代码详解

    写在前面 前面好多篇文章,我们总算是把整个ALNS的代码框架给大家说明白了.不知道大家对整个框架了解了没有.不过打铁要趁热,心急了要吃热豆腐.今天就来实战一下,教大家怎么用ALNS的代码框架,求解一个 ...

  9. 函数第一部分:经典的永远是简单的-Python基础前传(10)

    (一)前言 对于零基础学习Python的朋友,或者转行做数据分析的朋友,跟jacky交流最多的问题就是Python网络爬虫学习问题,比如说要爬取美团,或者说爬取携程等等,在爬取的过程中,这些朋友总是会 ...

  10. .net core 资料网站 和 开源项目

    https://www.xcode.me/ 1.ASP.NET Core模块化前后端分离快速开发框架介绍之1.开篇 2.https://www.cnblogs.com/laozhang-is-phi/ ...