async&await异步编程的一点巧方法

又见阿郎 又见阿郎     2022-09-05     109

关键词:

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

走进异步编程的世界-开始接触async/await 序  这是学习异步编程的入门篇。  涉及 C#5.0引入的 async/await,但在控制台输出示例时经常会采用C#6.0的$""来拼接字符串,相当于string.Format()方法。 目录What‘s异步?asyn... 查看详情

async和await之异步编程的学习

     async修改一个方法,表示其为异步方法。而await表示等待一个异步任务的执行。js方面,在es7中开始得以支持;而.net在c#5.0开始支持。本文章将分别简单介绍他们在js和.net中的基本用法。一、在js中的实现js... 查看详情

async和await之异步编程的学习

     async修改一个方法,表示其为异步方法。而await表示等待一个异步任务的执行。js方面,在es7中开始得以支持;而.net在c#5.0开始支持。本文章将分别简单介绍他们在js和.net中的基本用法。一、在js中的实现js... 查看详情

async和await异步方法(代码片段)

Async和Await关键字是C#异步编程的核心。通过使用这两个关键字,你可以使用.NETFramework或WindowsRuntime的资源创建一个异步方法如同你创建一个同步的方法一样容易。通过使用async和await定义的异步方法,这里被称为异步方法。 ... 查看详情

转走进异步编程的世界-开始接触async/await

  这是学习异步编程的入门篇。  涉及 C#5.0引入的 async/await,但在控制台输出示例时经常会采用C#6.0的$""来拼接字符串,相当于string.Format()方法。 目录What‘s异步?async/await结构What’s异步方法? 一、What‘s异... 查看详情

[c#]开始接触async/await异步编程

开始接触async/await异步编程序  之前已经整理了4篇关于LINQ的随笔,想换换口味。 目录What‘s异步?async/await结构What’s异步方法? 一、What‘s异步?   启动程序时,系统会在内存中创建一个新的进程。进... 查看详情

async&await异步请求处理办法(代码片段)

async&await异步请求处理办法目录async&await异步请求处理办法async&await一、async1、async函数2、回调async函数以获取结果二、await末async&awaitasync函数&await规定于ES2017.它们是基于promises的语法糖,使我们得以以更简洁的方式... 查看详情

异步编程z

走进异步编程的世界-开始接触async/await 序  这是学习异步编程的入门篇。  涉及 C#5.0引入的 async/await,但在控制台输出示例时经常会采用C#6.0的$""来拼接字符串,相当于string.Format()方法。 目录What‘s异步?asyn... 查看详情

异步编程

1、async/await特性结构异步方法:就是在处理完成之前就返回到调用方法。async/await特性结构由三个部分构成:(1)调用方法:调用异步方法的那个方法,它和异步方法可能在相同的线程,也可能在不同的线程。在异步方法执行其任... 查看详情

kotlin的suspend对比csharp的async&await

协程的出现大大降低了异步编程的复杂度,可以让我们像写同步代码一样去写异步代码,如果没有它,那么很多异步的代码都是需要靠回调函数来一层层嵌套,这个在我之前的一篇有介绍rxjava回调地狱-kotlin协程来... 查看详情

如何正确理解.net4.5和c#5.0中的async/await异步编程模式

参考技术A使用异步编程,可以避免性能瓶颈并增强应用程序的总体响应能力。但是,编写异步应用程序的传统技术可能比较复杂,使它们难以编写、调试和维护。C#中的async和await关键字都是异步编程的核心。通过使用这两个关... 查看详情

多线程编程学习笔记——async和await

...习笔记——async和await(一)三、  对连续的异步任务使用await操作符      本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步调用。1。示例代码如下。using... 查看详情

async和await

...求最低.NET版本为4.5。看很多朋友还是使用的Thread来使用异步多线程操作,基本上看不见有使用Async、Await进行异步编程的。各有所爱吧,其实都可以。只要正确使用就行,不过还是写了这篇文章推荐大家使用Async、Await。原因就是... 查看详情

使用 async/await 的异步 TcpListener 的正确方法

】使用async/await的异步TcpListener的正确方法【英文标题】:RightapproachforasynchronousTcpListenerusingasync/await【发布时间】:2014-03-1620:55:44【问题描述】:我一直在思考什么是使用异步编程设置TCP服务器的正确方法。通常我会为每个传入... 查看详情

异步编程之async和await(代码片段)

继续Dart异步编程的第五篇async和await。async和await是Dart异步编程用于简化异步API操作的两个关键字。它的作用就是能够将异步的代码使用同步的代码结构实现。相信学习过之前的Future和Stream的文章就知道,对于最终返回的值或者... 查看详情

多线程之异步编程:经典和最新的异步编程模型,async与await

经典的异步编程模型(IAsyncResult)最新的异步编程模型(async和await)将IAsyncInfo转换成Task将Task转换成IAsyncInfo示例1、使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类Thread/Async/ClassicAsync.cs/**使用经典的异步编程... 查看详情

网易云音乐数据交互—async&await实现版(完结篇)(代码片段)

...了,今天我们要将一个最重要的东西--关于ES7async结合Fetch异步编程问题。ES7async/await被称作异步编程的终极解决方案,我们先不管这个称呼,咱们先总结一下,过去5次分享我们一路走来异步编程是如何产生,到最后如何解决的。... 查看详情

c#异步编程

1.await例如有一个静态方法m,要在程序中异步调用这个方法,就在此方法前加关键字await,那么当程序运行到这条语句时,会立即返回包含这条语句的方法,并异步执行m方法,这样ui线程就不会被占用,然后当m方法执行结束后会再次返回这... 查看详情