c# - 何时使用 async 和 await - 客户端 vs webapi
问题描述
我正在使用 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 可以保持同步。但同样,我试图弄清楚这里最好的做法是什么(明智的最佳实践)。
解决方案
由于您已经要求最佳实践,因此一直保持异步。当您尝试使其以同步方式工作时,异步只会变得复杂(并给您带来麻烦)。一路异步(用 asp.net core 很容易做到),你会很好的。
来源:https ://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md
(如果 API 操作本质上没有做任何异步操作,您可以在该 API 上保留异步,但默认为异步。)
推荐阅读
- maxima - Maxima 中包含误差函数的方程的解析解
- javascript - 如何将 JavaScript 循环输出到页面上(而不是在控制台中)?
- unity3d - 此代码在多次重启关卡后导致我的游戏延迟。有什么建议么?
- javascript - 当未单击特定 div 时,如何仅调用从另一个函数中调用的函数?
- azure - 如何在用于连接到 SharePoint Online 的多租户应用程序中实施 SSL 证书?
- javascript - 在兄弟组件之间共享数据,同时它们都使用 *ngIf
- javascript - 如何删除作为匿名函数的事件侦听器?
- android - 如何检查与服务器 IP 的连接
- scikit-learn - 从 sklearn 导入困难
- python - 如何在 Python 中将任意长度的位序列转换为有符号或无符号整数?