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

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

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

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

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

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

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

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

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

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

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

解惑一(初步结果)
测试代码
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Task.Run(()=>FirsTask());
  6. Console.ReadLine();
  7. }
  8. public static async Task<string> FirsTask()
  9. {
  10. Console.WriteLine("1.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
  11. var result = await SecondTask();
  12. Console.WriteLine("6.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
  13. return result;
  14. }
  15. public static async Task<string> SecondTask()
  16. {
  17. using (var client = new HttpClient())
  18. {
  19. Console.WriteLine("2.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
  20. var result = await client.GetAsync(
  21. "http://stackoverflow.com/questions/37991851/jenkins-configure-page-not-loading-version1-651-3-chrome-browser");
  22. await ThirdTask();
  23. Console.WriteLine("5.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
  24. return await result.Content.ReadAsStringAsync();
  25. }
  26. }
  27. public static async Task<string> ThirdTask()
  28. {
  29. using (var client = new HttpClient())
  30. {
  31. Console.WriteLine("3.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
  32. var result = await client.GetAsync(
  33. "http://stackoverflow.com/questions/37993657/managing-outgoing-calls-settings-in-skype-for-business-client-using-remote-power");
  34. Console.WriteLine("4.当前线程是:" + Thread.CurrentThread.ManagedThreadId);
  35. return await result.Content.ReadAsStringAsync();
  36. }
  37. }
  38. }
输出结果
输出结果说明了前三个问题:
  我们可以看到输出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. net异步编程之await

    net异步编程之await 初探asp.net异步编程之await   终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...

  2. ASP.NET 异步编程之Async await

    本文重点介绍的是.NET Framework4.5 推出的异步编程方案  async await 请先看个5分钟的微软演示的视频:视频地址: https://channel9.msdn.com/Blo ...

  3. python异步编程之asyncio

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

  4. 异步编程之Generator(1)——领略魅力

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

  5. 异步编程之Promise(3):拓展进阶

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

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

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

  7. (翻译)异步编程之Promise(1):初见魅力

    原文:https://www.promisejs.org/ by Forbes Lindesay 异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2) ...

  8. Javascript异步编程之setTimeout与setInterval详解分析(一)

    Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...

  9. 异步编程之co——源码分析

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

随机推荐

  1. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  2. 企业IT管理员IE11升级指南【4】—— IE企业模式介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  3. CentOS RDO方式快速安装OpenStack

    一.了解RDO RDO是什么? RDO是红帽Red Hat Enterprise Linux OpenStack Platform的社区版,类似RHEL和Fedora,RHEV和oVirt这样的关系. ...

  4. 【原】Telerik radwindow 在IE10下偶尔报 unable to get value of the property 'toLowerCase' 的解决办法

    笔者正在开发的新项目在升级了最新版本的Telerik Control和决定支持IE10后,遇到了一个很棘手的问题,偶尔会在打开Radwindow的时候报JS error :unable to get ...

  5. 《Spark快速大数据分析》—— 第五章 数据读取和保存

    由于Spark是在Hadoop家族之上发展出来的,因此底层为了兼容hadoop,支持了多种的数据格式.如S3.HDFS.Cassandra.HBase,有了这些数据的组织形式,数据的来源和存储都可以多 ...

  6. Intellij IDEA 13.1.3 打开多个窗口项目

    作者QQ:1095737364 Intellij 是Java开发人员最喜欢的编程工具.默认情况只能打开一个窗口一个项目,本文就是教大家打开多个窗口,实现同时打开多个项目 第一步:打开Intellij, ...

  7. SSIS Destination 组件使用Fast-Load mode出错

    查看一个Package的历史Message 数据,发现 DataFlow Task 经常出错,错误信息的Description是: Description: "While reading c ...

  8. php常用函数

    1.随机数和时间 echo rand();  //随机数生成器echo rand(0,10); //生成某个范围内的随机数 <!DOCTYPE html PUBLIC "-//W3C/ ...

  9. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  10. Android随笔之——模拟按键操作的几种方式

    前几天转过一篇Android上模拟按键操作.触屏事件的博客,昨天又去找了百度.谷歌了一下,写了一点简单的测试代码,留待不时之需.有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之——使 ...