He estado trabajando en un artículo sobre métodos de controlador asíncrono en ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) y creo Puedo estar perdiendo el punto.
Considere este método que escribí, que es muy similar a un ejemplo del artículo:
[HttpGet]
[AsyncTimeout(8000)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
WidgetPageViewModel model = new WidgetPageViewModel()
{
toAdd = new Widget()
};
model.all = await _repo.GetAllAsync(cancellationToken);
return View(model);
}
Según tengo entendido, así es como se desarrollarán las cosas en tiempo de ejecución:
Se creará un hilo ASP.NET para una solicitud HTTP entrante.
Este hilo (presumiblemente ha realizado algunos trabajos preliminares necesarios) ingresará a mi método Index () anterior.
La ejecución alcanzará la palabra clave "esperar" y comenzará un proceso de adquisición de datos en otro hilo.
El subproceso original "ASP.NET" volverá al código que llamó a mi método de controlador, con una instancia de clase Tarea como valor de retorno.
El código de infraestructura que llamó a mi método de controlador continuará operando en el subproceso original "ASP.NET", hasta que llegue a un punto en el que necesite usar el objeto ActionResult real (por ejemplo, para representar la página).
La persona que llama accederá a este objeto utilizando el miembro Task.Result, lo que hará que (es decir, el hilo "ASP.NET") espere el hilo creado implícitamente en el paso 3 anterior.
No veo lo que esto logra en comparación con lo mismo sin esperar / asíncrono, excepto por dos cosas que percibo como insignificantes:
El subproceso de la persona que llama y el subproceso de trabajo creado por await pueden funcionar en paralelo durante un período de tiempo (la parte "hasta" del n. ° 5 anterior). Mi presentimiento es que ese período de tiempo es bastante pequeño. Cuando la infraestructura llama a un método de controlador, creo que generalmente necesita el ActionResult real de la llamada del controlador antes de que pueda hacer mucho (si es que hay algo) más.
Existe una nueva infraestructura útil relacionada con el tiempo de espera y la cancelación de operaciones asíncronas de controlador de larga duración.
El propósito de agregar métodos de controlador asíncrono supuestamente es liberar esos hilos de trabajo ASP.NET para responder realmente las solicitudes HTTP. Estos hilos son un recurso finito. Desafortunadamente, no veo cómo el patrón sugerido en el artículo realmente sirve para conservar estos hilos. E incluso si lo hace, y de alguna manera descarga la carga de manejar la solicitud a algún hilo que no sea ASP.NET, ¿qué logra eso? ¿Los hilos que son capaces de manejar una solicitud HTTP son muy diferentes de los hilos en general?
Execution will reach the "await" keyword and kick off a data acquisition process on another thread
-- No necesariamente.async
no requiere otro hilo ... Es una continuación. Se puede lograr reordenando las instrucciones en el mismo hilo.