IHttpActionResult 与异步任务<IHttpActionResult>

IHttpActionResult vs async Task<IHttpActionResult>

我见过的大多数 Web API 2.0 方法 return IHttpActionResult,它被定义为 "defines a command that asynchronously creates a System.Net.Http.HttpResponseMessage" 的接口。

我对方法 returning async Task<IHttpActionResult>.

时发生的事情感到有点困惑

你为什么要用一个而不是另一个?或者它们在功能上是否相同 - IHttpActionResult 不是已经异步了吗?

使用 IHttpActionResultasync Task<IHttpActionResult> 的区别在于您的代码是否使用了 asyncawait 功能。许多像 Entity Framework 这样的库提供了 async 版本的方法(例如 SaveChangesAsync),它们提供了轻微的性能提升。但是,将 async 与 Web API 一起使用存在缺陷,因此除非您了解许多特性,否则谨慎使用同步 API.

Steven Cleary 有很多关于 his blog about the idiosyncrasies of async and await. To get started I advise looking at Don't block on async code 的信息。

您的操作可能 return 一个 IHttpActionResult 当框架调用其 ExecuteAsync.

时异步执行操作

但是,如果您必须先进行一些其他异步调用,然后才能创建和 returning 结果,那么您将被迫将签名更改为 async Task<IHttpActionResult>。仅此而已。

如果您的控制器操作代码不使用 await,那么您可以切换回更简单的签名。但是,您 return 的结果仍然是异步的。

需要说明的是,在这两种情况下,您都在使用异步代码。

性能优势在于 - 如果对最深层的所有调用都是异步的 - Web 服务器线程在磁盘或网络期间不会被阻塞 I/O,您的服务器可以用更少的资源处理更多的请求。

在对任务调用 WaitResult 之前,或者在 ASP.NET 代码中自己创建任务之前,请仔细考虑。

手动编码、故意多线程或 Web 服务器代码并行的两个正当理由是:

  • 当它收到最少的流量但执行计算工作时,经常调用 运行 对数据进行计算并且您想使用所有 16 个核心。
  • 同时调用 >1 个数据库分片或 >1 个其他服务时,您需要预先为每个分片查询创建一个任务并等待它们。