async & await 异步编程的一点巧方法
await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程。
await关键字会阻塞/暂停它所在的方法,也即下面的 Phycology 方法.当阻塞时候,程序会回到调用 其(也就是await)的方法(说的绕口了,也就是await关键字所在的上一级方法)中去执行,也就是handle方法中去执行(await关键字调用后,会返回到调用xxxAsync方法的函数处继续同步执行),这点可以通过
C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 其内的程序来判断.
async & await 组合的程序片段一定要注意使用,在此列举几个注意事项,也可以说是优化事项。我将其放到了代码的注释部分,这样更方便你理解:
- /// <summary>
- /// ....各类书籍推荐...
- ///
- /// 应当在此处呈现await的返回值...
- /// </summary>
- /// <param name="args"></param>
- static void Main(string[] args)
- {
- //第一类书籍:心理学....
- var book = new List<book>()
- {
- new book() { book_classify = "心理学", book_name = "每一种孤独都有陪伴" },
- new book() { book_classify = "心理学", book_name = "愿你拥有被爱照亮的生命" },
- new book() { book_classify = "心理学", book_name = "感谢自己的不完美" },
- new book() { book_classify = "编程语言", book_name = "编写高质量代码 改善C#程序的157个建议" },
- new book() { book_classify = "编程语言", book_name = "python cookbook" },
- new book() { book_classify = "编程语言", book_name = "设计模式(C#版)" }
- };
- //var test = book.Where(p => p.book_classify == "心理学").Select(p => p.book_name);
- //foreach(var i in test)
- //{
- // Console.WriteLine(i);
- //}
- var task = handle(book);
- Console.WriteLine(task.Result);
- }
- /// <summary>
- /// Attention:
- /// 在这里取出我们通过Task任务放到线程池中处理并返回的数据,同时注意
- /// 除了传递异步调用方法(这里是 Phycology方法)之外,因为可能需要做其他的操作,
- /// 我们可以将await关键字放在异步调用方法返回的变量处,而不是直接使用await关键字去等待调用方法
- /// 这样设计充分利用了时间,提高了效率...
- /// </summary>
- /// <param name="book"></param>
- /// <returns></returns>
- public static async Task<string> handle(List<book> book)
- {
- var _physchology = Phycology(book);
- var _programmer = Programmer(book);
- ///在这里做一些其他的操作...
- ///以充分利用时间
- return await _physchology + await _programmer;
- }
- /// <summary>
- /// Attention:
- /// 应当将需要的数据返回到调用方法处...
- /// 在这里是 sb
- /// </summary>
- /// <param name="book"></param>
- /// <returns></returns>
- public static async Task<string> Programmer(List<book> book)
- {
- StringBuilder sb = new StringBuilder();
- return await Task.Run(() =>
- {
- var programmer = book.Where(p => p.book_classify == "编程语言").Select(p => p.book_name).ToList();
- foreach(var i in programmer)
- {
- sb.Append(i + "\r\n");
- }
- return sb.ToString();
- });
- }
- public static async Task<string> Phycology(List<book> book)
- {
- StringBuilder sb = new StringBuilder();
- return await Task.Run(() =>
- {
- var _phychology = book.Where(p => p.book_classify == "心理学").Select(p => p.book_name).ToList();
- foreach(var i in _phychology)
- {
- sb.Append(i + "\r\n");
- }
- return sb.ToString();
- });
- }
- }
最后的实现:
async & await 异步编程的一点巧方法的更多相关文章
- 【转】C# Async/Await 异步编程中的最佳做法
Async/Await 异步编程中的最佳做法 Stephen Cleary 近日来,涌现了许多关于 Microsoft .NET Framework 4.5 中新增了对 async 和 await 支 ...
- .NET Web应用中为什么要使用async/await异步编程
前言 什么是async/await? await和async是.NET Framework4.5框架.C#5.0语法里面出现的技术,目的是用于简化异步编程模型. async和await的关系? asy ...
- C#中 Thread,Task,Async/Await 异步编程
什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调 ...
- async/await 异步编程(转载)
转载地址:http://www.cnblogs.com/teroy/p/4015461.html 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入 ...
- async/await 异步编程
前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在 ...
- .NET 中的 async/await 异步编程
原文出处: Teroy 的博客 前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关 ...
- c# async/await异步编程死锁的问题
在异步编程中,如果稍有不注意,就会造成死锁问题.何为死锁:即两个以上的线程同时争夺被互相锁住的资源,两个都不放手. 在UI或asp.net中,容易造成死锁的代码如下所示: private void b ...
- c# 关于async/await异步编程的浅析和使用
线程的同步运行,时效性慢,异步运行,时效性快! 在c#5.0引出了async/await关键字,可以用其来进行异步编程. async/await定义异步方法的语法如下: 1.在方法的返回类型前面加上a ...
- Async await 异步编程说明
希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task 和 await ...
随机推荐
- 福利:工作经常用到的Mac软件整理(全)
每日更新关注:http://weibo.com/hanjunqiang 新浪微博!iOS开发者交流QQ群: 446310206 前言 这是我个人在工作中会用到的Mac软件,其中包括办公.开发.视频等 ...
- API创建员工支付方式
DECLARE ln_method_id PAY_PERSONAL_PAYMENT_METHODS_F.PERSONAL_PAYMENT_METHOD_ID%TYPE; ln_ext_acc_id P ...
- SpriteBuilder中返回的对象类型不正确的原因
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在码代码的时候,发现一个问题,特此写出来和大家分享,希望遇到 ...
- 开发Nginx模块Helloworld
本文是对<深入理解Nginx>一书中的实例进行实战时的记录. 1模块目录结构 my_test_module/ ├── config └── ngx_http_mytest_module.c ...
- Mybatis源码之Statement处理器CallableStatementHandler(六)
CallableStatementHandler实际就是使用CallableStatement来执行SQL语句,当然它执行的是存储过程. 源码如下: /** * @author Clinton Beg ...
- Unity UGUI基础之Button
UGUI Button,可以说是真正的使用最广泛.功能最全面.几乎涵盖任何模块无所不用无所不能的组件,掌握了它的灵巧使用,你就几乎掌握了大半个UGUI! 一.Button组件: Interactabl ...
- Android官方命令深入分析之绘制9-patch
9-patch是一个所见即所得的编辑器,允许你创建可以自动更改大小适应屏幕的bitmap图像.被选中的部分可以水平或垂直的进行缩放. 下面是使用9-patch工具创建一个9-patch图像的实例,首先 ...
- polaris: session和middleware的支持
起因 polaris虽然是模仿tornado开发,但我觉得作为一个go的web框架,还需要提供一些额外的扩展支持. polaris现在已经支持session以及middleware,主要参加djang ...
- Android代码(Handler的运用),HttpURLConnection的应用,将url图片地址转换成图片。
1 布局文件, <LinearLayout 秒, 抛异常 conn.connect(); // 开始链接 int responseCode = conn.getResponseC ...
- UILabel-UITextField-UIBotton UI_…
注意:AppDelegate是类,所以self在这个类中指的就是AppDelegate对象 - (BOOL)application:(UIApplication *)application didFi ...