c# - net - Async y espera en el controlador MVC 4
mvc task await (2)
Cada vez que trato de usar los nuevos operadores Async
y Await
y devuelvo una colección de objetos de una base de datos, obtengo una excepción de Invalid Operation
. Cuando lo uso para devolver solo un artículo, funciona bien.
Código del controlador:
public async Task<ActionResult> EnvironmentList()
{
EfEnvironmentDataAccess dataAccess = new EfEnvironmentDataAccess();
ICollection<Environment> environments = await dataAccess.GetAllEnvironmentsAsync();
return PartialView(environments);
}
Ver código:
<div class="ECURightCol">
<h3>Table Dumps</h3>
@Html.Action("EnvironmentList", "Environment")
@Html.Action("ComputerList", "Computer")
@Html.Action("ProductList", "Product")
@Html.Action("InstanceList", "Instance")
@Html.Action("ProfileList", "Profile")
El código de acceso a los datos:
public ICollection<Environment> GetAllEnvironments()
{
using (EcuWebDataContext db = new EcuWebDataContext())
{
return db.Environments.OrderBy(e => e.Name).ToList();
}
}
public async Task<ICollection<Environment>> GetAllEnvironmentsAsync()
{
return await Task.Run(() => GetAllEnvironments());
}
El error que recibo es:
Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código.
Detalles de la excepción: System.InvalidOperationException: HttpServerUtility.Execute se bloquea mientras espera que se complete una operación asíncrona.
En primer lugar, no puede utilizar el procesamiento asíncrono con acciones secundarias y supongo que esto es lo que está intentando hacer.
En segundo lugar, no está haciendo ningún procesamiento asíncrono aquí girando otro hilo para ejecutar su código con la siguiente línea de código:
Task.Run(() => GetAllEnvironments());
Bloqueará un hilo al final del día y no tendrá más que una sobrecarga de cambio de contexto. EF6 tendrá soporte para el procesamiento asíncrono. Para consultas asíncronas con ADO.NET puro, eche un vistazo:
Ha pasado algún tiempo desde que esta pregunta fue respondida. Pero estaba teniendo una situación similar con MVC 5 y pude hacer que un [ChildActionOnly] funcione de forma asíncrona simplemente comentando la siguiente línea en la sección <system.web>
del archivo web.config.
<system.web>
<!--<httpRuntime targetFramework="4.5" />-->
EDITAR: Considere esto como una solución alternativa mientras encuentra una solución real para su situación. Por favor, vea los comentarios de Leri a continuación.