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 异步编程的一点巧方法的更多相关文章

  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. Oracle AP Invoice APIs

     These APIs are handful when you want to do Insert, Update or Delete programmatically for some bus ...

  2. (NO.00005)iOS实现炸弹人游戏(九):游戏主角(二)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上篇介绍了游戏主角的初始化方法,下面我们一次来实现主角的其他方 ...

  3. Android实现系统ROOT, 并能赋予app root权限

    1. 获取root权限 -->  修改adb源码     a. 打开 system/core/adb/adb_main.cpp,或者是 system/core/adb/daemon/main.c ...

  4. 学习Tensorflow,使用源码安装

    PC上装好Ubuntu系统,我们一步一步来讲解如何使用源码安装tensorflow?(我的Ubuntu系统是15.10) 安装cuda 根据你的系统型号选择相应的cuda版本下载 https://de ...

  5. 8.非关系型数据库(Nosql)之mongodb的应用场景

     测试脚本: Mysql测试脚本: [php] view plaincopyprint? 1.  <?php 2.  header("Content-Type:text/html; ...

  6. SQL 2012 Always On 为 MSCRMSqlClrLogin SQL 登录名创建非对称密钥时报语法错误

    根据实施手册中的下图的SQL在为MSCRMSqlClrLogin 创建非对称秘钥时报语法错误,具体的错误在就path那,调了多次还是报错,索性就把SQL拆开执行. 先执行这条 SELECT * FRO ...

  7. android:getSlotFromBufferLocked: unknown buffer: 0xf3d544c0

    欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 今天运行一个小程序,退出的时候竟然打出一条错误log日志.一时慌乱,在国内网站也没找到合适的答复.通过查看国外的网站终于查到了原 ...

  8. VS2010创建和调用动态链接库

    当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发. 下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序 ...

  9. 【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  10. 尚学堂马士兵struts2 课堂笔记(四)

    27 结果类型 主要就四种种 dispatch和rediret chain和drdirectaction <package name="resultTypes" namesp ...