ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Ultimate ASP.NET CORE 6.0 Web API --- 读书笔记(14)

2022-06-16 19:34:13  阅读:190  来源: 互联网

标签:异步 ASP 请求 CORE Func2 读书笔记 Task 线程 完成


14 Asynchronous Code

本文内容来自书籍: Marinko Spasojevic - Ultimate ASP.NET Core Web API - From Zero To Six-Figure Backend Developer (2nd edition)

正常情况下,请求到达之后,服务器会在thread pooldelegates一个线程,处理这个请求,最后,在完成请求之后,会回到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 的异步命令执行时间稍长(由于处理线程的额外代码),所以将是否使用异步代码留在实现中决定,是比较好的选择

标签:异步,ASP,请求,CORE,Func2,读书笔记,Task,线程,完成
来源: https://www.cnblogs.com/huangwenhao1024/p/16383188.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有