MVC 4 Web Api:从操作返回任务

pav*_*vik 3 c# task-parallel-library asp.net-web-api

我的脑子里可能有些混乱,但我在以下内容中看到了一种混乱:

  • Web API控制器派生自ApiController类,其中的主要方法是ExecuteAsync,它使请求经过过滤器和操作的管道,最后返回Task;
  • Web API 操作支持利用 TPL 或 async/await 返回 Task 类型对象的能力。

我的问题是:我真的能从 API 操作中构建和运行任务中受益吗?据我了解,尽快将线程返回到 ASP.NET 线程池的目标已经由 ApiController.ExecuteAsync 基础结构实现,因此额外的异步级别对我没有任何帮助(除非我需要取消任务或在后端执行操作)平行线)。

有什么想法吗?谢谢。

Dre*_*rsh 5

不幸的是,与任何并行编程一样,答案是:它完全取决于您正在执行的处理类型。

对于初学者来说,ASP.NET 运行时已经为每个请求提供并发性。因此,如果您正在做的工作完全受计算限制,那么使用异步几乎没有什么好处。该规则的例外情况是,如果您在请求中处理的数据非常大,因此将受益于进一步的并发性。

使用异步确实有意义的最重要场景是当您执行任何类型的 I/O 工作(磁盘 I/O网络 I/O)时。例如,当您的 ASP.NET 控制器代码...

  • 与另一个后端 Web 服务通信
  • 与数据库服务器通信
  • 将文件信息读取/写入磁盘

在这些情况下您希望使用异步,因为在满足 I/O 请求时存在等待时间:磁盘或网络延迟。通过使用异步,您可以释放本来会被阻塞等待该数据的 CPU 线程,以便它可以处理一些其他计算密集型工作。