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

时间:2012-03-19 15:29:26

标签: c# task-parallel-library asp.net-web-api

可能我脑子里有些乱七八糟的东西,但我发现以下情况有些混乱:

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

我的问题是:我是否真的受益于在API操作中构建和运行任务?据我所知,将线程返回到ASP.NET线程池ASAP的目标已经由ApiController.ExecuteAsync基础结构执行,因此额外级别的异步不会给我任何东西(除非我需要取消任务或在后端执行操作)平行)。

有什么想法?感谢。

1 个答案:

答案 0 :(得分:4)

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

首先,ASP.NET运行时已经为每个请求提供了并发性。因此,如果您正在进行的工作完全是计算绑定的,那么使用异步几乎没有什么好处。该规则的例外情况是,您在请求中处理的数据非常大,因此可以从进一步的并发中受益。

使用异步的最重要方案是在进行任何类型的I / O工作时(磁盘I / O 网络I) / O)。例如,当您的ASP.NET控制器代码...

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

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