多线程!=异步,但是异步是基于多线程,
每个程序都有一条主线程,在我看来程序的执行是基于这条主线程的(该线程是被阻塞的),后续程序的功能调用都是由出现场进行触发调用(个人理解)
异步和同步:
async,await关键字方便了我们异步的编写
先说本质区别,同步就是由一条线程走整个方法;异步则会涉及到线程的切换其中每一次遇到awaot关键字线程都会进行切换一次
3次await关键字,其中线程id都不同,因此得出异步每一次遇到await都会进行一次线程的切换(该执行线程被释放),然后由这条切换的线程进行代码逻辑;如果有想要深刻研究的小伙伴可以用反编译器看一下会有申请的事情发送。
不使用await调用异步方法
当然异步方法也可以不使用await关键字,这又会出现神奇的情况
这个写法相当于Task.Run(Test2);(Test2),
因为没有了await这个关键字我的主线程调用这个方法就不进行等待,我直接开启一条线程运行Test2方法,这样写会有一个大的弊端那就是Test2这条线程假设报错,我们主线程是补抓不到的。
基于上面的东西我们应该有了一个概念:异步其实就是线程切换,然后提高了吞吐,当一个异步方法里面没有一个await时其实和同步无异,当拥有await关键字时也为同步调用但是每一次await都会切换一条新的线程来走后续的代码,当我们调用异步使用弃源时其实相当于Task.Run().。
多线程:
在我看来多线程没有多高级,无非就是我们程序在运行时我们不想阻塞主线程,而又能做一些读取接收信息等事情(一般是死循环来接收或者是这个接口只是做一件耗时的事但是这件事不会和我其他任何逻辑有依赖)。
后记:
如果有小伙伴想更加深刻的理解推荐看一下:https://space.bilibili.com/600592?spm_id_from=333.337.0.0
这个up主对异步讲解个人认为非常棒