我看到了一些关于这个主题的矛盾信息,我想在这里澄清一下。最初,您可能会有Web Api操作,例如:
Model Action();
HttpResponseMessage Action();
然后,通过对Web Api的TPL增强,您可以拥有
Task Action();
Task Action();
据说,ASP.NET足够聪明,可以通过等待任务完成并在此期间释放拾取请求的线程来处理它们。
太好了!世界上的一切都很简单。但是现在,随着Web API 2的推出,有第三种情况,即添加了IHttpActionResult,它提供Task ExecuteAsync()方法。
首先,如果您检查
Model Action();
HttpResponseMessage Action();
然后,通过对Web Api的TPL增强,您可以拥有
Task Action();
Task Action();
据说,ASP.NET足够聪明,可以通过等待任务完成并在此期间释放拾取请求的线程来处理它们。
太好了!世界上的一切都很简单。但是现在,随着Web API 2的推出,有第三种情况,即添加了IHttpActionResult,它提供Task ExecuteAsync()方法。
首先,如果您检查
IHttpActionResult
的实现,您会发现每个ExecuteAsync
实际上只返回Task.FromResult
(完全不是异步的,并且似乎不会比同步返回HttpResponseMessage
带来任何性能提升)。其次,我看到人们建议使用Task<IHttpActionResult>
,这似乎完全是多余的。我甚至看到一些人建议将这些方法结合起来并从您的操作中返回Task.Factory.StartNew(..)
,这似乎有点荒谬。
那么正确的异步使用IHttpActionResult
的方式是什么?您只需实现自己的异步操作,或者返回Task<IHttpActionResult>
,使您的方法成为async
,并在调用return Ok()
(或等效操作)之前等待IO-bound操作即可。
需要明确的是,我显然理解,仅仅从IHttpActionResult Action();
转换为Task<IHttpActionResult> Action();
而不改变方法体将不会有任何帮助。这是一个谜题的ExecuteAsync
的意图。
† https://dev59.com/IGEi5IYBdhLWcg3wMZ3a#21609402
->† {{链接1:https://dev59.com/IGEi5IYBdhLWcg3wMZ3a#21609402}}