【发布时间】:2019-10-25 03:25:41
【问题描述】:
我正在使用 ASP.NET Web Api 构建一个规划器,它目前在其中执行一些简单的 CRUD 操作。此 API 的主要目的之一是能够接受来自不同平台(Web 和 android 应用程序客户端)的请求。我的问题是关于 async 和 await 和 web api 的最佳实践(以及什么是有意义的)——我应该在哪里提供异步?在客户端级别还是在 API 级别(服务器)?
我知道 async 和 await 的主要目的之一是为 UI 提供响应能力。而且我知道异步模型主要涵盖 I/O 绑定或 CPU 绑定操作。我猜从这个意义上说,我的进程会受到 I/O 限制。但最佳实践是明智的,API 应该是异步的还是应该保留在客户端中?我的 api 将在 Azure 的应用服务上运行。
以下是我的 API 中的示例“获取”操作(同步代码而非实际代码):
[Authorize]
[Route("GetUser/{userId}")]
public IHttpActionResult GetUser(int userId)
{
return Ok(/* method calls are done here... */);
}
我提出的异步示例:
[Authorize]
[Route("GetUser/{userId}")]
public async Task<IHttpActionResult> GetUser(int userId)
{
return Ok(await /* method calls are done here... */);
}
我正在使用 HttpClient 向 api 发出请求。
我的期望是多个人将使用该客户端。所以我会假设客户端应该是异步的,并且 api 可以保持同步。但同样,我试图弄清楚这里最好的做法是什么(明智的最佳实践)。
【问题讨论】:
-
为什么你认为只有一个应用程序可以使用异步操作?单独处理每个应用程序。如果该应用程序正在执行异步操作,请异步执行。
-
在服务器端,使用
async可以让您处理更多请求(从而实现可扩展性)。在 客户端,使用async将释放 UI 线程(假设它是发出请求的线程),而操作系统正在等待位到达(因此您实现 响应能力) -
所以@haim770 你是说一直异步?
-
@Jae,这取决于您的需求。如果您期望服务器上的高负载并且它主要执行 IO,那么
async是一个合理的选择。无论如何,您必须意识到客户端使用异步 http 的事实并不意味着服务器也必须是异步的。即使服务器阻塞了自己的线程,你的 UI 仍然可以响应,并且无论客户端是否异步,服务器中的线程池仍然可以重用工作线程。 -
酷,谢谢@haim770,说得通。
标签: c# azure rest asp.net-web-api