2

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

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

示例: 在 ASP.NET MVC 中使用异步控制器

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

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

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

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

4

1 回答 1

2

Yes, I believe you are correct. The documentation states the following steps for initializing an async action.

  1. The Web server gets a thread from the thread pool (the worker thread) and schedules it to handle an incoming request. This worker thread initiates an asynchronous operation.

  2. The worker thread is returned to the thread pool to service another Web request.

The worker thread initiates an asynchronous operation (ie, you're not required to do it in the code). The use of "extra" asynchronous code in the examples you cite is likely meant to illustrate the use of AsyncManager.OutstandingOperations.Increment and Decrement (which inform the worker process that an operation is still running, even though the Async action may have returned).

于 2012-09-22T02:41:39.910 回答