我们计划使用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
我们也非常不愿意这样做,因为它似乎是不必要的冗余。
答案 0 :(得分:2)
是的,我相信你是对的。 documentation说明了初始化异步操作的以下步骤。
Web服务器从线程池(工作线程)获取一个线程,并安排它来处理传入的请求。该工作线程启动异步操作。
- 醇>
工作线程返回到线程池以服务另一个Web请求。
工作线程启动异步操作(即,您不需要在代码中执行此操作)。在您引用的示例中使用“额外”异步代码可能意味着使用AsyncManager.OutstandingOperations.Increment
和Decrement
(它告知工作进程操作仍在运行,即使异步操作也是如此)可能已经回来了。)