await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程。

await关键字会阻塞/暂停它所在的方法,也即下面的 Phycology 方法.当阻塞时候,程序会回到调用 其(也就是await)的方法(说的绕口了,也就是await关键字所在的上一级方法)中去执行,也就是handle方法中去执行(await关键字调用后,会返回到调用xxxAsync方法的函数处继续同步执行),这点可以通过

C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 其内的程序来判断.

async & await 组合的程序片段一定要注意使用,在此列举几个注意事项,也可以说是优化事项。我将其放到了代码的注释部分,这样更方便你理解:

  1. /// <summary>
  2. /// ....各类书籍推荐...
  3. ///
  4. /// 应当在此处呈现await的返回值...
  5. /// </summary>
  6. /// <param name="args"></param>
  7. static void Main(string[] args)
  8. {
  9. //第一类书籍:心理学....
  10. var book = new List<book>()
  11. {
  12. new book() { book_classify = "心理学", book_name = "每一种孤独都有陪伴" },
  13. new book() { book_classify = "心理学", book_name = "愿你拥有被爱照亮的生命" },
  14. new book() { book_classify = "心理学", book_name = "感谢自己的不完美" },
  15. new book() { book_classify = "编程语言", book_name = "编写高质量代码 改善C#程序的157个建议" },
  16. new book() { book_classify = "编程语言", book_name = "python cookbook" },
  17. new book() { book_classify = "编程语言", book_name = "设计模式(C#版)" }
  18. };
  19.  
  20. //var test = book.Where(p => p.book_classify == "心理学").Select(p => p.book_name);
  21.  
  22. //foreach(var i in test)
  23. //{
  24. // Console.WriteLine(i);
  25. //}
  26.  
  27. var task = handle(book);
  28.  
  29. Console.WriteLine(task.Result);
  30.  
  31. }
  32.  
  33. /// <summary>
  34. /// Attention:
  35. /// 在这里取出我们通过Task任务放到线程池中处理并返回的数据,同时注意
  36. /// 除了传递异步调用方法(这里是 Phycology方法)之外,因为可能需要做其他的操作,
  37. /// 我们可以将await关键字放在异步调用方法返回的变量处,而不是直接使用await关键字去等待调用方法
  38. /// 这样设计充分利用了时间,提高了效率...
  39. /// </summary>
  40. /// <param name="book"></param>
  41. /// <returns></returns>
  42. public static async Task<string> handle(List<book> book)
  43. {
  44. var _physchology = Phycology(book);
  45.  
  46. var _programmer = Programmer(book);
  47.  
  48. ///在这里做一些其他的操作...
  49. ///以充分利用时间
  50.  
  51. return await _physchology + await _programmer;
  52.  
  53. }
  54.  
  55. /// <summary>
  56. /// Attention:
  57. /// 应当将需要的数据返回到调用方法处...
  58. /// 在这里是 sb
  59. /// </summary>
  60. /// <param name="book"></param>
  61. /// <returns></returns>
  62. public static async Task<string> Programmer(List<book> book)
  63. {
  64. StringBuilder sb = new StringBuilder();
  65.  
  66. return await Task.Run(() =>
  67. {
  68. var programmer = book.Where(p => p.book_classify == "编程语言").Select(p => p.book_name).ToList();
  69.  
  70. foreach(var i in programmer)
  71. {
  72. sb.Append(i + "\r\n");
  73. }
  74.  
  75. return sb.ToString();
  76. });
  77.  
  78. }
  79.  
  80. public static async Task<string> Phycology(List<book> book)
  81. {
  82. StringBuilder sb = new StringBuilder();
  83. return await Task.Run(() =>
  84. {
  85.  
  86. var _phychology = book.Where(p => p.book_classify == "心理学").Select(p => p.book_name).ToList();
  87.  
  88. foreach(var i in _phychology)
  89. {
  90. sb.Append(i + "\r\n");
  91. }
  92.  
  93. return sb.ToString();
  94. });
  95. }
  96.  
  97. }

最后的实现:

  

async & await 异步编程的一点巧方法的更多相关文章

  1. 【转】C# Async/Await 异步编程中的最佳做法

    Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...

  2. .NET Web应用中为什么要使用async/await异步编程

    前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...

  3. C#中 Thread,Task,Async/Await 异步编程

    什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...

  4. async/await 异步编程(转载)

    转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...

  5. async/await 异步编程

    前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在 ...

  6. .NET 中的 async/await 异步编程

    原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...

  7. c# async/await异步编程死锁的问题

    在异步编程中,如果稍有不注意,就会造成死锁问题.何为死锁:即两个以上的线程同时争夺被互相锁住的资源,两个都不放手. 在UI或asp.net中,容易造成死锁的代码如下所示: private void b ...

  8. c# 关于async/await异步编程的浅析和使用

    线程的同步运行,时效性慢,异步运行,时效性快! 在c#5.0引出了async/await关键字,可以用其来进行异步编程. async/await定义异步方法的语法如下: 1.在方法的返回类型前面加上a ...

  9. Async await 异步编程说明

    希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task  和 await ...

随机推荐

  1. 福利:工作经常用到的Mac软件整理(全)

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博!iOS开发者交流QQ群: 446310206 前言 这是我个人在工作中会用到的Mac软件,其中包括办公.开发.视频等 ...

  2. API创建员工支付方式

    DECLARE ln_method_id PAY_PERSONAL_PAYMENT_METHODS_F.PERSONAL_PAYMENT_METHOD_ID%TYPE; ln_ext_acc_id P ...

  3. SpriteBuilder中返回的对象类型不正确的原因

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在码代码的时候,发现一个问题,特此写出来和大家分享,希望遇到 ...

  4. 开发Nginx模块Helloworld

    本文是对<深入理解Nginx>一书中的实例进行实战时的记录. 1模块目录结构 my_test_module/ ├── config └── ngx_http_mytest_module.c ...

  5. Mybatis源码之Statement处理器CallableStatementHandler(六)

    CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程. 源码如下: /** * @author Clinton Beg ...

  6. Unity UGUI基础之Button

    UGUI Button,可以说是真正的使用最广泛.功能最全面.几乎涵盖任何模块无所不用无所不能的组件,掌握了它的灵巧使用,你就几乎掌握了大半个UGUI! 一.Button组件: Interactabl ...

  7. Android官方命令深入分析之绘制9-patch

    9-patch是一个所见即所得的编辑器,允许你创建可以自动更改大小适应屏幕的bitmap图像.被选中的部分可以水平或垂直的进行缩放. 下面是使用9-patch工具创建一个9-patch图像的实例,首先 ...

  8. polaris: session和middleware的支持

    起因 polaris虽然是模仿tornado开发,但我觉得作为一个go的web框架,还需要提供一些额外的扩展支持. polaris现在已经支持session以及middleware,主要参加djang ...

  9. Android代码(Handler的运用),HttpURLConnection的应用,将url图片地址转换成图片。

     1 布局文件, <LinearLayout 秒, 抛异常 conn.connect();      // 开始链接 int responseCode = conn.getResponseC ...

  10. UILabel-UITextField-UIBotton&nbsp;UI_…

    注意:AppDelegate是类,所以self在这个类中指的就是AppDelegate对象 - (BOOL)application:(UIApplication *)application didFi ...