.NET Core 之 二 异步编程 async和await

杨中科老师视频 笔记
        .NET 5教程,.Net Core 2021视频教程,杨中科主讲_哔哩哔哩_bilibili

一、异步编程

        同步点餐和异步点餐                核心:不等

二、

        异步方法:用async关键字修饰的方法,方法命名规范尽量用 Async 结尾

        基本使用语法:1、异步方法的返回值一般是Task

                                 2、即使无返回值,也最好把返回值声明为Task;

                                 3、调用异步方法时用await;

                                 4、异步方法具有“传染性”;

三、

        HttpClient 类,HttpClientFactory 类

        例子:下载网页

        对于不支持异步方法怎么办?用Task 类的属性 Result,用于不能写await的时候;

方法 await() 用于没有返回值,不能写await的时候,尽量不要用Result和await(),可能会死锁;

        ThreadPool 线程池类;

        异步lambda表达式,委托,async;

四、async和await的原理

        反编译讲解;

        结论:async和await是语法糖,async的方法会被C#编译器编译成一个类,会主要根据await调用进行切分为多个状态,对async方法的调用会被拆分成对MoveNext的调用;

五、

        验证:await调用的等待期间,.NET会把当前的线程返回给线程池,等异步方法调用完毕后,框架会从线程池再取出来一个线程执行后续的代码;

        Thread.CurrentThread.ManagedThreadId 获取当前线程的ID;

        与异步点餐对比;

        可以用于优化应用,避免线程切换;

六、异步方法不等于多线程

        验证:异步方法的代码并不会自动在新线程中执行,除非把代码放到新线程中执行;

        使用Taks.Run() 切换新线程;

七、为什么有的方法标async有的没有标async

        async方法的缺点:1、异步方法会被编译器生成一个类,运行效率没有普通方法高

                                       2、可能会占用非常多的线程

        直接返回Task,可以不用“拆完了再装”,相当于普通方法的调用;

        优点:运行效率更高,不会造成线程的浪费;

        什么时候可以去掉async?做简单的转发时,直接返回Task

        Taks.FromResult() 手动把结果转换成Task

八、如果想在异步方法中暂停一段时间,不要使用Thread.Sleep(),因为它会阻塞当前调用的线程,而要使用await Task.Delay()

        例子,作业,下载网页失败后停顿500毫秒再重试3次,都失败时则返回失败;

九、CancellationToken        处理请求提前终止;

        例子讲解

        在ASP.NET Core 中使用CancellationToken,最后有讲基本使用提高应用性能;

        Debug.writeLine();

十、Task 类的重要方法

        WhenAny        任意一个完成;

        WhenAll        所有都完成,经常用;

        FromResult()        创建普通数值的Task对象

        例子讲解

十一、异步编程的其他问题

        1、定义接口时不用写async,实现类中写async

        2、yield return 语法,作用简化写法,演示调试时代码的执行顺序神奇之处

                数据流水化,提升性能;

                async与yield 使用的冲突,在C#8.0后采用新特性

        3、不要同步、异步混用;

        特别写法,异步遍历foreach

                await foreach(var s in Test()){ Console.WriteLine(s);}

        

你可能感兴趣的:(.NET,.net)