IHttpActionResult vs async Task <ihttpactionresult> </ihttpactionresult>

时间:2015-03-17 13:46:47

标签: c# asynchronous asp.net-web-api2

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

我对方法返回async Task<IHttpActionResult>时发生的事情感到有些困惑。

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

2 个答案:

答案 0 :(得分:16)

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

但是如果在创建和返回结果之前必须首先进行其他异步调用,那么您将被迫将签名更改为async Task<IHttpActionResult>。这就是全部。

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

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

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

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

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

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

答案 1 :(得分:12)

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

Steven Cleary在his blog上提供了很多关于asyncawait的特性的信息。要开始使用,我建议您查看Don't block on async code