• 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 + "
    ");
                    }
    
                    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 + "
    ");
                    }
    
                    return sb.ToString();
                });
            }
    
        }
    

    最后的实现:

      

  • 相关阅读:
    漂亮灵活设置的jquery通知提示插件toastr
    C# 对List<T>取交集、连集及差集
    查看sqlserver被锁的表以及如何解锁.
    javascript的setTimeout()用法总结,js的setTimeout()方法
    日志插件 log4net 的使用
    Log4NET简介
    解决WCF大数据量传输 ,System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接
    也说Autofac在MVC的简单实践:破解在Controller构造函数中的实例化
    Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现
    Asp.net mvc中整合autofac
  • 原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/7041224.html
Copyright © 2020-2023  润新知