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
不是已经异步了吗?
使用 IHttpActionResult
和 async Task<IHttpActionResult>
的区别在于您的代码是否使用了 async
和 await
功能。许多像 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,您的服务器可以用更少的资源处理更多的请求。
在对任务调用 Wait
或 Result
之前,或者在 ASP.NET 代码中自己创建任务之前,请仔细考虑。
手动编码、故意多线程或 Web 服务器代码并行的两个正当理由是:
- 当它收到最少的流量但执行计算工作时,经常调用 运行 对数据进行计算并且您想使用所有 16 个核心。
- 同时调用 >1 个数据库分片或 >1 个其他服务时,您需要预先为每个分片查询创建一个任务并等待它们。
我见过的大多数 Web API 2.0 方法 return IHttpActionResult
,它被定义为 "defines a command that asynchronously creates a System.Net.Http.HttpResponseMessage" 的接口。
我对方法 returning async Task<IHttpActionResult>
.
你为什么要用一个而不是另一个?或者它们在功能上是否相同 - IHttpActionResult
不是已经异步了吗?
使用 IHttpActionResult
和 async Task<IHttpActionResult>
的区别在于您的代码是否使用了 async
和 await
功能。许多像 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,您的服务器可以用更少的资源处理更多的请求。
在对任务调用 Wait
或 Result
之前,或者在 ASP.NET 代码中自己创建任务之前,请仔细考虑。
手动编码、故意多线程或 Web 服务器代码并行的两个正当理由是:
- 当它收到最少的流量但执行计算工作时,经常调用 运行 对数据进行计算并且您想使用所有 16 个核心。
- 同时调用 >1 个数据库分片或 >1 个其他服务时,您需要预先为每个分片查询创建一个任务并等待它们。