记录一次C#的asyn和await
static void Main(string[] args)
{ var d = new NavDownLoader();
Task<bool> success = d.DownLoadLatestNavAsync(); Console.WriteLine("等....");
Console.WriteLine("结果:" + success.Result.ToString());
Console.WriteLine("完成"); Console.ReadKey();
}
已知DownLoadLatestNavAsync()是一个耗时10s+的方法,现在这个代码,效果就是:
1. 马上打印 "等...."
2. 在10s + 之后,打印 “结果:false”;
3. 在第2步之后,马上打印 “完成”
public class NavDownLoader
{
/// <summary>
/// 异步下载
/// </summary>
/// <returns></returns>
public async Task<bool> DownLoadLatestNavAsync()
{
bool success = false;
await Task.Run(new Action(() =>
{
success = DownLoadLatestNav();
}));
return success;
} /// <summary>
/// 同步下载
/// </summary>
/// <returns></returns>
public bool DownLoadLatestNav()
{
Thread.Sleep();
}
}
在DownLoadLatestNavAsync(),中:
1. 等了10s才执行到:return success; 也就是说,await这句,对于DownLoadLatestNavAsync()是阻塞的。
而且,async 方法中,如果不添加await 关键字,会有提示警告!告诉你这个方法将会同步执行。(我理解是,被它的调用者(main函数)同步执行,不执行完它,它的调用者就进行不下去)
结论:
1. 调用async方法时,是异步调用的,马上去执行下面的语句。
2. 如果执行完主函数的语句后,使用Task.Result获取结果的时候,如果async方法没完成,会卡在那里。
3. 在async方法体中,要有 “await + 耗时操作” 这样的语句,而且这个语句会阻塞它后面的语句。
4. await + 耗时操作语句,也可以表现为 bool success = await DownLoadLatestNav(); 要注意的是,此时 public async Task<bool> DownLoadLatestNav() ,忽略掉await的警告即可。
*在习惯上应该await xxxx_async();await关键字,是说明,最终在哪个地方“耗时”;
其他参考:https://www.cnblogs.com/liqingwen/p/5831951.html
记录一次C#的asyn和await的更多相关文章
- 为什么我们要使用Async、Await关键字
前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...
- edge.js架起node.js和.net互操作桥梁
今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作..net版本在4.5及以上,因为.net4.5带来的Task,asy ...
- Nodejs与Net 和SQL 交互利器Edge.js
https://github.com/tjanczuk http://www.cnblogs.com/joylee/archive/2013/02/05/msnodesql.html edge.js这 ...
- OSS.Social微信项目标准库介绍
经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下, ...
- [PY3]——函数——生成器(yield关键字)
函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...
- 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库
分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...
- 多线程分配线程的实现方案:CountDownLatch类
需求:假如我们本地有4个文件需要解析,每个文件的内容为20万行.为了提高效率我们要创建4个线程进行处理.等4个线程处理完,要在文件日志表中记录处理状态. 一般的的解决方法是使用join,join用于让 ...
- AppBox实战: 如何实现一对多表单的增删改查
本篇通过完整示例介绍如何实现一对多关系表单的相应服务及视图. 一.准备数据结构 示例所采用的数据结构为"物资需求"一对多"物资清单",通过IDE的实体设 ...
- 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...
随机推荐
- ThinkPHP5实现定时任务
ThinkPHP5实现定时任务 最近使用ThinkPHP5做了个项目,项目中需要定时任务的功能,感觉有必要分享下 TP5做定时任务使用到command.php的 步骤如下: 1.配置command.p ...
- mui中判断是点击还是滑动
判断和滑动是两种触发方式 滑动分为四种,上下左右(swipeup,swipedown,swipeleft,swiperight) 点击分为两种,点击和双击,一般用单机(tap) 根据自己不同的需求进行 ...
- 14.Django基础之jQuery操作cookie
jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery.cookie.js基于jquery:先引入jquer ...
- [go设计模式]简单工厂模式
优点 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可 ...
- 前端深入之css篇丨2020年前,彻底掌握css动画【transition】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- Mariadb 基于Mycat实现读写分离
环境:Mariadb主:192.168.200.129 Mariadb从:192.168.200.114 Mycat :192.168.200.112 (1) 安装jdk,先查看本机是 ...
- OEMCC 13.3 主机agent部署问题排查
部署安装 具体的安装过程可参考,Alfred Zhao的文章,非常详细,文章是OEMCC13.2的部署过程.OEMCC13.3没有太大差别. https://www.cnblogs.com/jyzha ...
- ionic3 浏览器端返回
首屏component.ts文件中使用setupBrowserBackButtonBehavior() { // Register browser back button action(s) wind ...
- 【JZOJ5263】分手是祝愿
Description 请注意本题的数据范围. Input Output Sample Input 2 2 15 19 3 30 40 20 Sample Output 285 2600 Hint 数 ...
- 【DP合集】m-knapsack
给出 n 个物品,第 i 个物品有重量 w i .现在有 m 个背包,第 i 个背包的限重为 c i ,求最少用几个背 包能装下所有的物品. Input 输入的第一行两个整数 n, m ( n ≤ 2 ...