Asp.net mvc MVC3异步控制器-执行同步I/O任务

Asp.net mvc MVC3异步控制器-执行同步I/O任务,asp.net-mvc,asp.net-mvc-3,azure,parallel-processing,azure-web-roles,Asp.net Mvc,Asp.net Mvc 3,Azure,Parallel Processing,Azure Web Roles,我们计划使用AsyncController,因为我们的大多数请求都是长时间运行的I/O绑定请求。我们的计划是将此处理卸载到CLR线程,以保持最大数量的IIS线程自由地为新的传入请求提供服务 到目前为止,我们所看到的每个使用AsyncController的示例都从AsyncController的异步操作方法中异步执行长时间运行、I/O绑定的进程。我们可以看到这样做的价值,如果您有2个或更多操作可以在控制器的异步操作方法中并行运行 例如: 在那里,它们异步执行新闻服务。这真的需要吗?如果您只需要在

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

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

例如:

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

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

我们还看到了另一种策略,使用Task.Factory.StartNew(),如下所示:


我们也不希望这样做,因为这似乎是多余的。

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

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

  • 工作线程返回到线程池以服务另一个Web请求


  • 工作线程启动一个异步操作(即,代码中不要求您这样做)。在您引用的示例中使用“额外”异步代码很可能是为了说明
    AsyncManager.OutstandingOperations.Increment
    Decreation
    (通知工作进程操作仍在运行,即使异步操作可能已返回)。

    基于今天的一些测试,看来,虽然我们的理解可能是正确的,但这可能是不明智的,因为它违背了目的。我有一个关于超越明显极限的问题: