首页 > 代码库 > async & await 异步编程的一点巧方法
async & await 异步编程的一点巧方法
await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程。
await关键字会阻塞/暂停调用它的方法,也即下面的 Phycology 方法.当阻塞其调用方法的时候,程序会回到UI线程中去执行,也就是main方法中去执行,这点可以通过
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 异步编程的一点巧方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。