终于毕业了,也顺利进入一家期望的旅游互联网公司。27号入职。放肆了一个多月没写代码,好方啊。

另外一下观点均主要针对于await.

请先看这段话,来自async in C# 5.0.  接下来几个月的时间,我将花时间来简单翻译这本书。

写在前面(带着问题学习)
一.根据代码和执行结果,初探异步编程的执行过程。

*问题1:await会让当前线程一直等待吗?await等待的时间中一直占用线程资源吗?

*问题2:等待await数据返回交给等待线程再继续向下执行吗?

*问题3:向await下一条语句执行的线程,是执行await的线程吗?

二.异步编程async,await的使用意义和适用场景。

*问题1:异步编程可以让程序变快吗?

*问题2:异步编程执行耗时计算有用吗?

*问题3:既然异步编程执行顺序和同步相同,那么其意义何在?

解惑一(初步结果)
测试代码
 class Program{static void Main(string[] args){Task.Run(()=>FirsTask());Console.ReadLine();}public static async Task<string> FirsTask(){Console.WriteLine("1.当前线程是:" + Thread.CurrentThread.ManagedThreadId);var result = await SecondTask();Console.WriteLine("6.当前线程是:" + Thread.CurrentThread.ManagedThreadId);return result;}public static async Task<string> SecondTask(){using (var client = new HttpClient()){Console.WriteLine("2.当前线程是:" + Thread.CurrentThread.ManagedThreadId);var result = await client.GetAsync("http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser");await ThirdTask();Console.WriteLine("5.当前线程是:" + Thread.CurrentThread.ManagedThreadId);return await result.Content.ReadAsStringAsync();}}public static async Task<string> ThirdTask(){using (var client = new HttpClient()){Console.WriteLine("3.当前线程是:" + Thread.CurrentThread.ManagedThreadId);var result = await client.GetAsync("http://stackoverflow.com/questions/37993657/managing-outgoing-calls-settings-in-skype-for-business-client-using-remote-power");Console.WriteLine("4.当前线程是:" + Thread.CurrentThread.ManagedThreadId);return await result.Content.ReadAsStringAsync();}}}

输出结果
输出结果说明了前三个问题:
我们可以看到输出1和6,2和5,3和4往往不是相同的线程,但是也未必不是相同的线程。 事实证明,await不会让当前线程等待await的结果,继而由等待线程继续向下执行。 而是,遇到await时,当前线程会被释放到线程池。在await返回结果后,在调用任意空闲线程向下执行
解惑二(意义和用途)
由于当前线程遇到await时会被释放到线程池不会在时间上的等待中占用线程资源。 事实也证明,我们当前异步代码的执行顺序和同步代码执行顺序是相同的,在这样的情况下,线程被释放就是可以被重复利用的。 这样的重要意义在于,iis中线程池线程数是有限的,如果当前可以并发一百个请求,在同步情况下, 那么一百个请求导致一百个线程都在等待中。但是在异步过程中,线程被释放了,阻塞等待的时间没有了,也就可以容纳更多的请求。 程序要向下执行,依然要等到await结果,所以说同步和异步的执行时间是一样的,不会因为异步而减少执行时间。

异步编程特别适用于网络操作,因为网络操作发起请求之后等待它完成就行,所以这时候执行到这的线程,可以释放并会到线程池中,网络操作执行完成之后,再从线程池中随机拿一个线程继续执行。

最后的补充:刚才讨论的是await的作用。之所以如上测试代码能够按照同步的过程来执行,是await的作用。比如我们在FirstTask中不等待SecondTask的结果时,那么执行顺序是会改变的,6会提前输出出来。这是async的作用,不阻塞线程。我个人认为,在不需要await结果的情况下,async是可以减少执行时间的。

转载请注明本文地址: http://www.cnblogs.com/tdws/p/5613871.html%20%20%20%20

初探asp.net异步编程之await相关推荐

  1. python3 sleep 并发_python异步编程之asyncio(百万并发)

    点击上方蓝字关注我们 目录 [python 异步编程之 asyncio(百万并发)] 一.asyncio 二.aiohttp 前言:python 由于 GIL(全局锁)的存在,不能发挥多核的优势,其性 ...

  2. pythonasyncio并发编程实战_python异步编程之asyncio(百万并发)

    [python异步编程之asyncio(百万并发)] 前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上 ...

  3. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  4. python异步编程之asyncio(百万并发)

    前言:python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板,如最新的 ...

  5. ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await

    PS:异步编程的本质就是新开任务线程来处理. 约定:异步的方法名均以Async结尾. 实际上呢,异步编程就是通过Task.Run()来实现的. 了解线程的人都知道,新开一个线程来处理事务这个很常见,但 ...

  6. JS异步编程之callback

    为什么 JS 是单线程? 众所周知,Javascript 语言的执行环境是"单线程"(single thread). 所谓"单线程",就是指一次只能完成一件任务 ...

  7. Dart 异步编程之 Isolate 和事件循环

    尽管 Dart 是个单线程任务,但它提供 Future.Stream.后台任务以及其他特性用于编写现代异步程序以及响应式程序(Flutter).本文讲的是 Dart 后台任务的基础:Isolate 和 ...

  8. python异步asy_Python 异步编程之asyncio【转载】

    一.协程的认识 协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术. 简而言之,其实就是通过一个线程实现代码块相互切换执行.例如:deffunc1():print(1) . ...

  9. Node.js 异步编程之 Callback介绍

    原文:http://www.jb51.net/article/63070.htm ------------------------------------- Node.js 基于 JavaScript ...

最新文章

  1. Redis的安装及创建节点、部署群集
  2. 微软开发x86模拟器,让Windows for ARM能运行x86应用
  3. ajax学习----json,前后端交互,ajax
  4. 【转】ROWNUM与ORDER BY先后关系
  5. 51nod 1272 最大距离 O(nlog(n)) , 快排 , 最大连续子串
  6. 互联网“高薪榜”曝光,物联网将接棒?
  7. 跨Rollup转账应用HopProtocol将于4月份上线主网
  8. [转]国内Linux操作系统发行商分类溯源
  9. 《Python核心编程》第二版第407页第十三章练习 续六 -Python核心编程答案-自己做的-...
  10. 黑客帝国代码雨(bat)
  11. java动态规划求最大子段和_动态规划-最大子段和
  12. hublider配置php环境(wamp、phpstudy,php工具箱...)
  13. js 经纬度坐标转换
  14. [精简]托福核心词汇78
  15. MySQL学习第三弹——约束与多表查询详解
  16. NOI 十连测 Zbox loves ants
  17. 省计算机软件评审活动网站,2012年广东省计算机教育软件评审活动.doc
  18. linux与window双引导U盘启动
  19. 设计师:室内设计师的简介、工作内容、工作要求、设计常识(硬装/软装/榻榻米/马卡龙/地台/公共空间/玄关/闭水实验、家具知识(欧式雕花家具-欧式雕花家具)、室内设计常用尺寸之详细攻略
  20. python+django线上教学平台vue教育系统

热门文章

  1. SCPPO(二十三):SQLServer数据库备份那些事儿
  2. 10岁女程序员,婉拒谷歌Offer,研发全球首款AI桌游,现在是一名CEO
  3. 丰田要建专属自动驾驶测试场,再也不用共享了
  4. Hyperledger发布Burrow新版本,改进集成和开发体验
  5. 命令历史及快捷键介绍
  6. 使用 CometD、Apache 和 Camel 的 502 代理错误
  7. mysql主备(centos6.4)
  8. ios 语言本地化处理
  9. 桌面虚拟化之本地模式(离线模式)大比拼
  10. [转]几种软件测试工具