我见过的大多数Web API 2.0方法返回IHttpActionResult
,它被定义为“定义异步创建System.Net.Http.HttpResponseMessage的命令”的接口。
我对方法返回async Task<IHttpActionResult>
时发生的事情感到有些困惑。
为什么要使用一个而不是另一个?或者它们在功能上是否相同 - IHttpActionResult
是否已经异步?
答案 0 :(得分:16)
您的操作可能会返回IHttpActionResult
,当框架调用ExecuteAsync
时,它会异步执行操作。
但是如果在创建和返回结果之前必须首先进行其他异步调用,那么您将被迫将签名更改为async Task<IHttpActionResult>
。这就是全部。
如果您的控制器操作代码没有使用await
,那么您可以切换回更简单的签名。但是,您返回的结果仍然是异步的。
要明确的是,在这两种情况下,您都在使用异步代码。
性能优势是 - 如果所有最深层次的调用都是异步的 - 在磁盘或网络I / O期间不会阻止Web服务器线程,您的服务器可以用更少的资源处理更多请求。
在任务上调用Wait
或Result
之前要仔细考虑,或者在ASP.NET代码中自己创建一个任务。
Web服务器代码的手动编码,故意多线程或并行性的两个合理原因是:
答案 1 :(得分:12)
使用IHttpActionResult
和async Task<IHttpActionResult>
之间的区别在于您的任何代码是否都使用了async
和await
功能。许多像Entity Framework这样的库提供了async
版本的方法(例如SaveChangesAsync
),这些方法提供了轻微的性能提升。但是,将async
与Web API结合使用存在一些缺陷,因此除非您了解许多特性,否则坚持使用同步API是明智的。
Steven Cleary在his blog上提供了很多关于async
和await
的特性的信息。要开始使用,我建议您查看Don't block on async code。