2

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

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

例子: Using an Asynchronous Controller in ASP.NET MVC

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

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

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

我们非常不喜欢做这种方式,或者说,因为它似乎不必要的冗余。

回答

2

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

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

  2. 工作线程返回到线程池以处理其他Web请求。

工作者线程启动异步操作(即,你不这样做的代码需要)。在您引用的示例中使用“额外”异步代码可能意味着说明使用AsyncManager.OutstandingOperations.IncrementDecrement(它通知工作进程仍在运行,即使异步操作可能已经返回)。

+0

基于今天的一些测试,似乎虽然我们的理解可能是正确的,但这可能是不明智的,因为它破坏了目的。这里是我有关超越一个明显的限制的问题:[Azure Web角色压力测试 - 在AsyncController 1000ms阻止操作](http://stackoverflow.com/questions/12549805/azure-web-role-stress-test-1000ms-阻断-操作进行中asynccontroller) –