5

我是否需要做任何事情来使所有请求异步或以这种方式自动处理?

我进行了一些测试,似乎每个请求都在自己的线程中出现,但我认为最好问一下,因为我可能测试错了。

更新:(我有一个不完全解释的坏习惯 - 抱歉)这是我的担忧。客户端浏览器向我的http://data.domain/com/employee_database/?query=state:Colorado服务器发出 REST 请求。这涉及到控制器中的适当方法。该方法查询数据库并返回一个对象,然后将其转换为 JSON 结构并返回给调用应用程序。

现在假设有 10,000 个客户端都对同一台服务器进行类似的查询。所以我有 10,000 个请求同时进入。我的控制器方法会在 10,000 个不同的线程中同时被调用吗?还是必须在调用第二个请求之前返回第一个请求?

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

4

4 回答 4

2

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

于 2014-01-24T06:31:21.637 回答
2

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

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

于 2015-09-30T20:23:37.430 回答
1

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

更新: 您的操作方法将在 10,000 个线程中并行执行(理想情况下)。为什么我说理想是因为具有 10,000 个线程的 CLR 线程池并不典型,也可能不切实际。框架也有物理限制和限制,但我想你的问题的答案是请求将被并行处理。这里的正确术语是“并行”而不是“异步”。

于 2013-09-06T19:16:40.403 回答
0

无论是同步还是异步都是您的选择。你选择顺便写你的动作。如果你返回一个任务,并且在后台使用异步 IO,它就是异步的。在其他情况下,它是同步的。

不要async对你的行为和使用Task.Run. 那就是异步同步(一种已知的反模式)。它必须是真正异步的,一直到操作系统内核。

没有框架可以使同步 IO 自动异步,因此它不会在后台发生。异步 IO 是基于回调的,这是编程模型的一个重大变化。

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

于 2013-09-07T18:33:52.657 回答