我是否需要做任何事情来使所有请求异步或者是否以这种方式自动处理?
我运行了一些测试,似乎每个请求都在自己的线程上,但我觉得最好问一下,因为我可能测试错了。
更新:(我有一个不完全解释的坏习惯 - 抱歉)以下是我的担忧。客户端浏览器向我的http://data.domain/com/employee_database/?query=state:Colorado服务器发出REST请求。这涉及到控制器中的适当方法。该方法查询数据库并返回一个对象,然后该对象变为JSON结构并返回到调用应用程序。
现在让我们说10,000个客户端都对同一台服务器进行类似的查询。所以我有10,000个请求立即进入。我的控制器方法是否会在10,000个不同的线程中同时调用?或者第一个请求必须在第二个请求被调用之前返回?
我没有询问我的处理程序方法中有异步组件的代码。对于我的情况,请求变为单个SQL查询,因此代码没有任何可以异步处理的内容。在我收到请求的数据之前,我无法从该方法返回。
答案 0 :(得分:2)
我认为你应该在你的情况下使用异步IO /操作,例如数据库调用。在Web Api中是,每个请求都有自己的线程,但如果有多个连续请求,则线程可能会耗尽。线程也使用内存,所以如果你的api受到太多请求的攻击,它可能会给你的系统带来压力。
使用异步过度同步的好处是您可以明智地使用系统资源。在等待数据库调用完成同步实现时,异步将释放线程以处理更多请求,或者为进程需要线程分配线程,而不是阻塞线程。一旦IO(数据库)调用完成,另一个线程将从那里获取它并继续执行。如果您的IO操作需要更长时间才能完成,Async也会使您的api运行得更快。
答案 1 :(得分:1)
说实话,你的问题不是很清楚。如果您使用HttpClient
进行HTTP GET,比如GetAsync
方法,则会触发请求,您可以在线程中执行任何操作,直到获得响应为止。所以,这个请求是异步的。如果您询问处理此请求的服务器端(假设它是ASP.NET Web API),那么异步与否取决于您实现Web API的方式。如果你的动作方法,在阻塞模式下同步执行三个事情,比如说1,2和3,那么同一个线程就会向服务请求。另一方面,上面说#2是对Web服务的调用,它是一个HTTP调用。现在,如果您使用HttpClient并进行异步调用,则可能会遇到一个请求由多个线程提供服务的情况。为此,您应该异步地从操作方法调用HTTP调用并使用async
关键字。在这种情况下,当您在操作方法中调用await
时,您的操作方法执行将返回,并且为您的请求提供服务的线程可以自由地为其他请求提供服务,并且最终在响应可用时,相同或其他某个线程将从以前离开的地方继续。很长的无聊答案,或许很难通过打字来解释,我猜。希望你能清楚一点。
<强>更新强> 您的操作方法将在10,000个线程中执行并行(理想情况下)。为什么我说理想是因为具有10,000个线程的CLR线程池不是典型的并且可能也是不切实际的。框架也有物理限制和限制,但我想你的问题的答案是请求将并行处理。这里的正确术语是“并行”但不是“异步”。
答案 2 :(得分:1)
默认情况下,没有REST不是异步的。请求是同步处理的。但是,您的Web服务器(IIS)具有多个可以同时工作的最大线程设置,并且它维护所接收请求的队列。因此,请求进入队列,如果线程可用则执行其他操作,请求在IIS队列中等待,直到线程可用
答案 3 :(得分:0)
无论是同步还是异步都是您的选择。您可以选择编写动作的方式。如果您返回一个任务,并且还在底层使用异步IO,则它是异步的。在其他情况下,它是同步的。
不要试图对你的行为发起async
并使用Task.Run
。这是异步同步(已知的反模式)。它必须真正异步到OS内核。
没有框架可以使同步IO自动异步,所以它不会发生在幕后。 Async IO是基于回调的,这是编程模型的一个重大变化。
这不能回答你应该做的事情。那将是一个新问题。