【发布时间】:2015-05-15 19:01:11
【问题描述】:
我一直看到有关该主题的一些相互矛盾的信息,我想在这里澄清一下。
最初,您将拥有 Web Api 操作,例如:
Model Action();HttpResponseMessage Action();
然后,通过向 Web Api 添加 TPL 增强功能,您可以拥有
Task<Model> Action();Task<HttpResponseMessage> Action();
据推测,ASP.NET 将足够聪明,可以通过等待任务完成并同时释放接收请求的线程来处理这些问题。
美丽! 世界上一切都很简单。但是现在,在 Web API 2 中,增加了IHttpActionResult,第三种情况,它提供了Task<HttpResponseMessage> ExecuteAsync() 方法。
首先,如果您检查IHttpActionResult 的实现,您会看到每个ExecuteAsync 实际上只返回Task.FromResult(根本不是异步的,而且看起来它不会比同步返回@987654331 带来任何性能提升@)。其次,我看到有人推荐使用Task<IHttpActionResult>,这似乎完全是多余的。我什至看到有少数人建议您将这些方法结合起来并从您的操作中返回Task.Factory.StartNew(..),这似乎有点荒谬。
那么异步使用IHttpActionResult的正确方法是什么?您是简单地实现自己的,并在那里执行异步操作†,还是返回Task<IHttpActionResult>,使您的方法async,并在调用return Ok()(或等效)之前等待IO绑定操作?
需要明确的是,我很清楚,简单地从 IHttpActionResult Action(); 到 Task<IHttpActionResult> Action(); 而不更改方法主体将无济于事。 ExecuteAsync 的意图是一个谜。
【问题讨论】:
-
使用
Task.FromResult是一个实现细节——也就是说,实现者已经决定不使用异步,但如果有必要,将来可能会决定使用它。而没有很好的方法来异步实现同步 API。
标签: c# task-parallel-library asp.net-web-api asp.net-web-api2