杨中科老师视频 笔记
.NET 5教程,.Net Core 2021视频教程,杨中科主讲_哔哩哔哩_bilibili
一、异步编程
同步点餐和异步点餐 核心:不等
二、
异步方法:用async关键字修饰的方法,方法命名规范尽量用 Async 结尾
基本使用语法:1、异步方法的返回值一般是Task<T>;
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<T>,可以不用“拆完了再装”,相当于普通方法的调用;
优点:运行效率更高,不会造成线程的浪费;
什么时候可以去掉async?做简单的转发时,直接返回Task<T>
Taks.FromResult() 手动把结果转换成Task<T>;
八、如果想在异步方法中暂停一段时间,不要使用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、不要同步、异步混用;