IHttpActionResult vs async Task

我见过的大多数Web API 2.0方法返回IHttpActionResult ,它定义为“定义异步创建System.Net.Http.HttpResponseMessage的命令”的接口。

当方法返回async Task时,我有点困惑。

你为什么要用另一个呢? 或者这些function是否完全相同 – IHttpActionResult不是已异步的吗?

使用IHttpActionResultasync Task之间的区别在于您的代码是否使用了asyncawaitfunction。 像Entity Framework这样的许多库都提供了async版本的方法(例如SaveChangesAsync ),这些方法提供了轻微的性能提升。 但是,使用Web API async存在缺陷,因此除非您了解许多特性,否则坚持使用同步API是明智的。

Steven Cleary在他的博客上有很多关于asyncawait的特性的信息。 为了开始,我建议查看不要阻止异步代码 。

您的操作可能会返回一个IHttpActionResult ,它在框架调用其ExecuteAsync时异步执行操作。

但是,如果在创建和返回结果之前必须先进行其他异步调用,则必须将签名更改为async Task 。 就是这样。

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

为了清楚起见,在这两种情况下,您都使用异步代码。

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

在调用WaitResult on a Task之前要仔细考虑,或者在ASP.NET代码中自己创建一个Task。

Web服务器代码的手动编码,故意multithreading或并行性的两个合理原因是:

  • 当它接收最少的流量但执行计算工作时,每隔一段时间就会调用一次调用来计算数据并且你想要使用所有16​​个核心。
  • 当对数据库分片或> 1个其他服务进行> 1个同时调用时,您需要预先为每个分片查询创建一个任务并等待它们全部。