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的更多相关文章

  1. 为什么我们要使用Async、Await关键字

    前不久,在工作中由于默认(xihuan)使用Async.Await关键字受到了很多质问,所以由此引发这篇博文“为什么我们要用Async/Await关键字”,请听下面分解: Async/Await关键字 ...

  2. edge.js架起node.js和.net互操作桥梁

    今天要介绍的是edge.js这个github上刚兴起的开源项目,它可以让node.js和.net之间在in-process下互操作..net版本在4.5及以上,因为.net4.5带来的Task,asy ...

  3. Nodejs与Net 和SQL 交互利器Edge.js

    https://github.com/tjanczuk http://www.cnblogs.com/joylee/archive/2013/02/05/msnodesql.html edge.js这 ...

  4. OSS.Social微信项目标准库介绍

    经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下, ...

  5. [PY3]——函数——生成器(yield关键字)

    函数—生成器篇 1. 认识和区分可迭代or生成器 1.1 可迭代对象 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象 当你使用一个列表生成式来建立一个列表的时候,就建立了一个可迭代 ...

  6. 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...

  7. 多线程分配线程的实现方案:CountDownLatch类

    需求:假如我们本地有4个文件需要解析,每个文件的内容为20万行.为了提高效率我们要创建4个线程进行处理.等4个线程处理完,要在文件日志表中记录处理状态. 一般的的解决方法是使用join,join用于让 ...

  8. AppBox实战: 如何实现一对多表单的增删改查

      本篇通过完整示例介绍如何实现一对多关系表单的相应服务及视图. 一.准备数据结构   示例所采用的数据结构为"物资需求"一对多"物资清单",通过IDE的实体设 ...

  9. 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理

    在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...

随机推荐

  1. js常用Matn函数的操练

    Math.PI console.log(Math.PI); 随机数以及向下取整 这是一个能实现从a-b之间随机打印一个整数 function rand_s(a, b) { var x = a + (b ...

  2. .Net Core删除ClientApp目录,重新生成报错解决办法

    因为在老的项目上做修改,需要删除单独的spa目录,就把ClientApp删掉了.但是重新生成报错,在VS2017界面上也没找到在什么地方配置.最后发现在csproj上里面可以去掉spa的配置 < ...

  3. Cocos Creator 3D 打砖块教程(二) | 子弹发射与摄像机平滑移动

    在线体验链接: http://example.creator-star.cn/block3d/ 前面一篇文章,我们讲了[打砖块]游戏中的3D物体的场景布局.材质资源.物理刚体与碰撞组件,接下来本篇文章 ...

  4. 继续学习freertos消息队列

    写在前面:杰杰这个月很忙~所以并没有时间更新,现在健身房闭馆装修,晚上有空就更新一下!其实在公众号没更新的这段日子,每天都有兄弟在来关注我的公众号,这让我受宠若惊,在这里谢谢大家的支持啦!!谢谢^ 在 ...

  5. JVM垃圾回收(下)

    接着上一篇,介绍完了 JVM 中识别需要回收的垃圾对象之后,这一篇我们来说说 JVM 是如何进行垃圾回收. 首先要在这里介绍一下80/20 法则: 约仅有20%的变因操纵着80%的局面.也就是说:所有 ...

  6. DJango配置mysql数据库以及数据库迁移

    DJango配置mysql数据库以及数据库迁移 一.Django 配置MySQL数据库 在settings.py中配置 import pymysql # 配置MySQL pymysql.install ...

  7. CentOS 7.7版本中NAT上网问题

    一.NAT(地址转换模式)概念 如果你的网络ip资源紧缺,但是你又希望你的虚拟机能够联网,这时候NAT模式是最好的选择.NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网. 二.具体 ...

  8. js判断是否为空和typeof的用法

    (1)typeof作用用于查看数据类型 (2)typeof用法typeof 返回值类型有number, string, boolean, function, undefined, objectPS:在 ...

  9. 动态分配内存-realloc

    动态分配内存---relloc 关于 malloc 就不多说了,现在看看 realloc: 函数声明: void *realloc(void *ptr, size_t size); 功能:动态改变指针 ...

  10. Neo4j:图数据库GraphDB(二)高级查找

    接着上一篇,继续介绍图数据库Neo4j: http://www.cnblogs.com/rongyux/p/5537028.html 三 高级查找操作 1过滤   name = "Tom H ...