我们计划使用 AsyncController,因为我们的大多数请求将是长时间运行的 I/O 绑定请求。计划是将此处理卸载到 CLR 线程,以保持最大数量的 IIS 线程空闲来为新的传入请求提供服务。
到目前为止,我们看到的每个使用 AsyncController 的示例都是从 AsyncController 的异步操作方法内部异步执行长时间运行的、I/O 绑定的进程。我们可以看到这样做的价值,如果您有 2 个或更多可以在 Controller 的 Async 操作方法中并行运行的操作。
在那里,他们异步执行新闻服务。这真的需要吗?如果它是您需要在该操作方法中执行的唯一事情,那么异步执行新闻服务似乎是多余的。在我们的例子中,我们有一个很长的 I/O 进程要运行。我们不能从我们的操作方法的异步版本中同步运行它吗?一旦我们在 AsyncController 中的异步操作方法中,工作不会已经传递给 CLR 线程吗?
同样,如果我们有更多可以并行运行的工作,我们可以看到我们希望如何异步执行进一步的操作。但是,我们只有一个长阻塞操作,并且希望保持代码简单。
我们还看到了另一种策略,使用 Task.Factory.StartNew(),如下所示: 在 ASP.NET MVC 2 中使用 AsyncController
我们也非常希望不这样做,因为这似乎是不必要的多余。