Ultimate ASP.NET CORE 6.0 Web API --- 读书笔记(14)
2022/6/17 1:20:09
本文主要是介绍Ultimate ASP.NET CORE 6.0 Web API --- 读书笔记(14),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
14 Asynchronous Code
本文内容来自书籍: Marinko Spasojevic - Ultimate ASP.NET Core Web API - From Zero To Six-Figure Backend Developer (2nd edition)
正常情况下,请求到达之后,服务器会在thread pool
中delegates
一个线程,处理这个请求,最后,在完成请求之后,会回到thread pool
值得注意的是,如果一个请求需要花费3秒或者更多的时间,那么无论在同步还是异步的模式下,消耗的时间都是相差无几的
当第三个请求进来的时候,那么我们的线程池已经超支了,所以第三个请求会等待直到线程回归或者HTTP超时
还有一种情况是,如果请求需要从数据库中拉取一系列数据,那么我们知道这是一个I/O操作,所以有可能会很耗时,而我们的线程在期间除了等待什么都做不了
如果在异步的模式下的时候,情况就不太一样了。
同样的,在请求到达的时候,也会在线程池中委托一个线程来完成这个请求,但是不一样的是,当这个请求需要花费一段时间从数据库中拉取数据的时候,这个线程会回归线程池,现在,我们的线程池中又有可用的线程了,然后我们就可以接受其他的请求了,然后当第一个请求的拉取数据动作有结果之后,又会从线程池中委托线程来完成后续的工作。
14.2 Async,Await Keywords,and Return Types
async
关键字是为了声明方法是异步的,并且可以在方法内部使用await
关键字
await
做了几件事
比如
public async Task<IEnumerable<Company>> Func1() { _logger.LogInfo("Inside the GetCompanies method."); var companies = await Func2(); return companies; }
- 检查这个
Func2
是否已经完成了,如果完成了,那么会直接继续执行后面的方法,就像是同步的一样;如果没有完成,那么会暂停Func1
,并且返回一个未完成的task
(也就是方法直接返回了,回到了调用Func1
的位置,线程会回归) - 一旦这个动作完成了,那么就会从
Func2
的位置接着继续做
那么如何得知方法是否完成,这就需要借助Task
这个类型
- Task,没有返回值
- Task
,有返回值 - void
Task
代表的是一个执行中的异步方法而不是方法的结果,它有几种属性来表明这个操作是不是完成了,使用这些属性,我们可以跟踪这个异步操作。这也被叫做TAP(Task-based Asynchronous Pattern)
在接口中,没有使用async
标记,因为我们希望将是使用同步还是异步,留在实现类中决定
有时候,使用异步代码会比同步的代码要慢,因为 EF Core
的异步命令执行时间稍长(由于处理线程的额外代码),所以将是否使用异步代码留在实现中决定,是比较好的选择
这篇关于Ultimate ASP.NET CORE 6.0 Web API --- 读书笔记(14)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#