MVC3 AsyncController - 执行同步I / O任务

时间:2012-09-22 01:20:12

标签: asp.net-mvc asp.net-mvc-3 azure parallel-processing azure-web-roles

我们计划使用AsyncController,因为我们的大多数请求都是长时间运行的I / O绑定请求。计划是将此处理卸载到CLR线程,以便保持最大数量的IIS线程可以免费为新的传入请求提供服务。

到目前为止,我们看到的每个使用AsyncController的示例都是从AsyncController的异步操作方法中异步执行长时间运行的I / O绑定进程。我们可以看到这样做的价值,如果您有两个或更多操作可以在Controller的Async操作方法中并行运行。

实施例: Using an Asynchronous Controller in ASP.NET MVC

在那里,他们异步执行新闻服务。这真的需要吗?如果它是您需要在该操作方法中执行的唯一事情,那么异步执行新闻服务似乎是多余的。在我们的例子中,我们有一个很长的I / O进程来运行。我们不能在我们的action方法的异步版本中同步运行它吗?一旦我们进入AsyncController中的异步操作方法,工作是否已经传递给CLR线程?

同样,如果我们有更多可以并行运行的工作,我们可以看到我们如何异步执行进一步的操作。但是,我们只有一个长阻塞操作,并且更愿意保持代码简单。

我们还看到了另一种策略,使用Task.Factory.StartNew(),如下所示: Using the AsyncController in ASP.NET MVC 2

我们也非常不愿意这样做,因为它似乎是不必要的冗余。

1 个答案:

答案 0 :(得分:2)

是的,我相信你是对的。 documentation说明了初始化异步操作的以下步骤。

  
      
  1. Web服务器从线程池(工作线程)获取一个线程,并安排它来处理传入的请求。该工作线程启动异步操作。

  2.   
  3. 工作线程返回到线程池以服务另一个Web请求。

  4.   

工作线程启动异步操作(即,您不需要在代码中执行此操作)。在您引用的示例中使用“额外”异步代码可能意味着使用AsyncManager.OutstandingOperations.IncrementDecrement(它告知工作进程操作仍在运行,即使异步操作也是如此)可能已经回来了。)

相关问题