Este es mi codigo:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Pero cuando llamé a la función desde controller. Mostró error
Una segunda operación comenzó en este contexto antes de que se completara una operación asincrónica anterior. Utilice 'await' para asegurarse de que las operaciones asincrónicas se hayan completado antes de llamar a otro método en este contexto. No se garantiza que ningún miembro de instancia sea seguro para subprocesos.
Por favor ayudame a resolver este problema.
Respuestas:
La excepción explica claramente que solo se permite una operación asincrónica por contexto a la vez.
Por lo tanto, debe hacerlo de
await
uno en uno, como sugiere el mensaje de error:var banner = await context.Banners.ToListAsync(); var newsGroup = await context.NewsGroups.ToListAsync();
O puede utilizar varios contextos:
var banner = context1.Banners.ToListAsync(); var newsGroup = context2.NewsGroups.ToListAsync(); await Task.WhenAll(banner, newsGroup);
fuente
Si está utilizando un contenedor de IoC para su inyección de proveedor de datos, considere usar el tipo "transitorio" o "PerWebRequest" para su ciclo de vida.
Por ejemplo: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
fuente
Si usa Unity para la inyección de dependencias con, por ejemplo, un patrón de repositorio, obtendrá el siguiente error al usar dos o más contextos con crear / actualizar / eliminar:
Esto se puede resolver usando
PerRequestLifetimeManager
. Más info aquí:C # EF6 realiza múltiples llamadas asíncronas a un contexto usando Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager()); container.RegisterType<ISupplierRepository, SupplierRepository>(); container.RegisterType<IContactRepository, ContactRepository>();
fuente