Asynchronous Web API 2-所有REST请求都是异步的吗?

Asynchronous Web API 2-所有REST请求都是异步的吗?,asynchronous,asp.net-web-api,Asynchronous,Asp.net Web Api,我是否需要做任何事情使所有请求都异步,或者它们是以这种方式自动处理的 我运行了一些测试,似乎每个请求都有自己的线程,但我认为最好问一下,因为我可能测试错了 更新:(我有一个不完全解释的坏习惯-对不起)这是我关心的问题。客户端浏览器向我的服务器发出REST请求。这将进入控制器中的相应方法。该方法查询数据库并返回一个对象,然后将该对象转换为JSON结构并返回给调用应用程序 现在让我们假设10000个客户端都对同一台服务器进行类似的查询。所以我一次收到10000个请求。我的控制器方法会在10000个不

我是否需要做任何事情使所有请求都异步,或者它们是以这种方式自动处理的

我运行了一些测试,似乎每个请求都有自己的线程,但我认为最好问一下,因为我可能测试错了

更新:(我有一个不完全解释的坏习惯-对不起)这是我关心的问题。客户端浏览器向我的服务器发出REST请求。这将进入控制器中的相应方法。该方法查询数据库并返回一个对象,然后将该对象转换为JSON结构并返回给调用应用程序


现在让我们假设10000个客户端都对同一台服务器进行类似的查询。所以我一次收到10000个请求。我的控制器方法会在10000个不同的线程中同时调用吗?或者第一个请求必须在调用第二个请求之前返回


我不是在问我的处理程序方法中有异步组件的代码。在我的例子中,请求变成了一个SQL查询,因此代码中没有可以异步处理的内容。在我得到请求的数据之前,我无法从该方法返回。

老实说,你的问题不是很清楚。如果您正在使用
HttpClient
创建一个HTTP GET,比如说
GetAsync
方法,请求将被触发,您可以在线程中执行任何您想要的操作,直到您得到响应为止。所以,这个请求是异步的。如果您询问处理此请求的服务器端(假设它是ASP.NET Web API),那么异步与否取决于您如何实现Web API。如果您的操作方法在阻塞模式下一个接一个地同步执行三件事情,比如1、2和3,那么同一个线程将处理请求。另一方面,假设上面的#2是对web服务的调用,它是一个HTTP调用。现在,如果您使用HttpClient并进行异步调用,您可能会遇到一种情况,即一个请求由多个线程提供服务。要实现这一点,您应该异步地从操作方法发出HTTP调用,并使用
async
关键字。在这种情况下,当您在action方法内调用
wait
时,您的action方法执行返回,为您的请求提供服务的线程可以自由地为其他请求提供服务,最终当响应可用时,相同或其他线程将从之前停止的位置继续。很长很无聊的答案,也许只是很难通过打字来解释。希望你能弄清楚

更新:
您的操作方法将在10000个线程中并行执行(理想情况下)。我之所以这么说,是因为拥有10000个线程的CLR线程池并不典型,而且可能也不实用。有物理限制,也有框架施加的限制,但我想对你的问题的答案是,请求将被并行服务。这里正确的术语是“并行”,而不是“异步”。

是同步还是异步是您的选择。你通过写动作的方式来选择。如果您返回一个任务,并且在后台使用异步IO,那么它是异步的。在其他情况下,它是同步的

不要试图在操作中使用
async
,而使用
Task.Run
。这是异步过同步(一种已知的反模式)。它必须是真正异步的,一直到操作系统内核

没有任何框架可以使同步IO自动异步,因此它不能在幕后进行。异步IO是基于回调的,这是编程模型中的一个严重变化


当然,这并不能回答你应该做什么。这将是一个新问题。

默认情况下,No-REST不是异步的。请求是同步处理的。但是,您的web服务器(IIS)具有可同时工作的多个最大线程设置,并且它维护接收的请求队列。因此,请求进入队列,如果某个线程可用,它将在其他线程中执行,请求将在IIS队列中等待,直到某个线程可用

我认为您应该使用异步IO/操作,例如在本例中的数据库调用。是的,在WebAPI中,每个请求都有自己的线程,但如果有许多连续的请求,线程可能会耗尽。线程也使用内存,所以如果api被太多的请求击中,可能会给系统带来压力


使用async over sync的好处是您可以明智地使用系统资源。异步将释放线程来处理更多的请求,或者为其分配任何进程需要的线程,而不是在同步实现中等待数据库调用完成时阻塞线程。一旦IO(数据库)调用完成,另一个线程将从那里获取它并继续实现。如果IO操作需要更长的时间才能完成,异步也会使api运行得更快

如果您指的是异步操作,那么您应该使用
async
public async Task Get(){…}
@vladimirflov为什么web api不能在每次开始为用户服务时创建线程?这样一来,一个人是否在动作中睡觉就无关紧要了,因为它已经在自己的线程中了。@David,请你详细说明你的发现。下面的答复似乎并没有回答您的具体问题。@EvolGate我认为标记的答案确实回答了我的问题。@DavidThielen实际上,我有一个Web Api 2项目,它正在同步工作。我的意思是,我试图同时从不同的浏览器中点击GET URL,但控制台日志是按顺序打印的。如果请求是异步的,那怎么可能呢?对不起,我有一个坏习惯,认为人们可以从我的头脑中了解细节。我更新了问题,希望现在已经足够了。谢谢。我的测试表明了这一点,但最好有一个权威的答案,因为我的测试可能已经结束了。对于这个例子,如果有1000个并行请求,其余的都在u队列中,我就可以了