C#异步/等待后端服务/Web服务是否有用?
C#异步/等待后端服务/Web服务是否有用?,c#,.net,multithreading,async-await,C#,.net,Multithreading,Async Await,async/await在后端/webservice场景中有用吗 在这种情况下,所有请求/工作只有一个线程。如果这个线程等待一个任务,它不会被阻塞,但它也没有其他工作要做,所以它只是空闲。(它无法接受另一个请求,因为当前执行正在等待任务解决) 在这种情况下,每个请求/工作项有一个线程。该线程仍然处于空闲状态,因为另一个请求由另一个线程处理 我能想象的唯一情况是同时执行两个async操作,就像读取文件并发送http请求一样。但这听起来像是一个罕见的案例。应该先读文件,然后发布内容,而不是发布我甚至没
async
/await
在后端/webservice场景中有用吗
在这种情况下,所有请求/工作只有一个线程。如果这个线程等待一个任务,它不会被阻塞,但它也没有其他工作要做,所以它只是空闲。(它无法接受另一个请求,因为当前执行正在等待任务解决)
在这种情况下,每个请求/工作项有一个线程。该线程仍然处于空闲状态,因为另一个请求由另一个线程处理
我能想象的唯一情况是同时执行两个async
操作,就像读取文件并发送http请求一样。但这听起来像是一个罕见的案例。应该先读文件,然后发布内容,而不是发布我甚至没有读过的东西
在这种情况下,所有请求/工作只有一个线程
我要求你说这是一个非常深奥的案件。甚至在多核服务器成为标准之前,asp.net每个核心使用了50多个线程
如果这个线程在等待一个任务,它不会被阻塞,但它也没有其他工作来完成它
无所事事
不,它返回到池中处理其他请求。大多数web服务都喜欢用尽可能少的资源处理尽可能多的请求。服务器只处理一个客户端是一种罕见的边缘情况。非常罕见。大多数web服务将处理大量客户端抛出的请求
在这种情况下,每个请求/工作项有一个线程。该线程仍然处于空闲状态,因为另一个请求由另一个线程处理
这更接近现实,但服务器不仅仅是无限期地添加线程——在某个时刻,如果没有线程来处理请求,它会让请求排队。这就是释放一个目前没有其他有效工作要做的线程开始赢得胜利的地方。阅读您的问题时,您很难不感到您误解了Web服务器的工作方式以及
异步/wait
线程的工作方式。为了简单起见,可以这样想:async/await
在查询外部资源(例如数据库、web服务/API、系统文件等)时几乎总是很好使用的。如果你遵循这个简单的规则,你就不需要对每种情况都想得太深
但是,当您阅读并了解更多关于这些主题的内容并获得良好的经验时,深入思考在每种情况下都是必不可少的,因为任何规则都有例外,因此在某些情况下,使用async/await
&线程的开销可能会超出其好处。例如,微软决定不在ASP.NETCore中的记录器中使用它,甚至在源代码中也有关于它的注释
在您的情况下,Web服务器使用的线程要比您想象的多得多,而且原因也比您想象的多得多。另外,当线程空闲等待某件事情时,它不能执行其他任何操作。async/await
所做的是将线程从当前等待的任务中释放出来,这样线程就可以返回池并执行其他操作。等待的任务完成后,将从池中拉出一个线程(可以是另一个线程)以继续作业。您似乎在某种程度上理解了这一点,但也许您不知道Web服务器中的线程还能做什么。相信我,还有很多事情要做
最后,请记住线程是通用工作线程,它们可以做任何事情。Web服务器可能有用于不同任务的专用线程,但它们分为两到三类。线程仍然可以在其类别内执行任何操作。Web服务器甚至可以在需要时将线程移动到不同的类别。所有这些都是为你做的,所以在大多数情况下你不需要考虑它,你只需要专注于释放线程,这样web服务器就可以完成它的工作。这个问题听起来像是你在以文本格式转储你的思维导图。听起来像是有人认为web服务一次只能处理一个请求,这听起来很糟糕-甚至不知道人们是如何在非常罕见的边缘案例之外获得这个想法的。将async/Wait视为将工作委托给另一个线程是错误的。