netcore同步异步是什么?

1.介绍

同步就是服务员在你旁边等你点好菜,所以其他进来的人都要等你点完
异步就是服务员给所有进来的人一份菜单,大家都可以同时点
先让所有客人都可以点完餐,不让他们觉得被冷落,把所有菜单丢给后厨,忙的是后厨,不断的压榨后厨

2.本质

本质上不会缩短某个客人的上菜时间,只是同时接收所有人的请求,但是后厨还是需要按菜单一个一个炒菜的。对于真正的程序来说,就好比服务器先把所有请求都接收然后全丢给后端,但后端处理请求还是得一个一个来,好处是服务器不会因为堆了太多请求而把其他请求拒之门外

3.为什么要标记await?

不加await但也不赋值话那只是警告

一但赋值则不行,因为异步方法在没有真正执行完成之前编译器都认为返回的将是Task类型,所以无法直接赋值给string类型

除非手动声明异步方法被编译器推断的类型

但是这样做往往只是在欺骗编译器而已,你我都知道,最后返回的肯定是string类型。所以演化出更好的写法,使用await去告诉编译器直接给我异步执行后的返回值类型就好了

4.如何在一个不支持async标志的方法中调用异步方法?

对于有返回值的异步方法:使用Result,因为Result的get属性会阻塞当前线程直到此异步操作完成以模拟await效果,但因为会阻塞,异常的出现将会导致程序锁死。

对于无返回值的异步方法:使用Wait(),但是也一样可能导致死锁

# 关于await、Result、Wait()介绍:
https://www.cnblogs.com/moonstars/p/12910207.html

5.总结:

异步方法的返回值一般是Task<T>,T是真正的返回值类型,如Task<int>。
调用异步方法时,一般在方法前加上await关键词,这样拿到的返回值就是泛型指定的T类型
即使方法没有返回值,也最好把方法的返回声明为非泛型的Task,如 static async Task Main(string[] args),因为主线程碰到await就返回了 ,对于主线程来说是有返回值的 ,返回值就是await后面的 Task
异步方法具有传染性,如果一个方法存在await调用,则这个方法也必须修饰为async
posted @ 2023-01-31 13:34  long-livece  阅读(97)  评论(0编辑  收藏  举报