Este é o meu código:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Mas quando chamei a função do controlador. Mostrou erro
Uma segunda operação foi iniciada neste contexto antes da conclusão de uma operação assíncrona anterior. Use 'await' para garantir que todas as operações assíncronas foram concluídas antes de chamar outro método neste contexto. Nenhum membro de instância tem garantia de thread-safe.
Por favor me ajude a resolver este problema.
Respostas:
A exceção explica claramente que há apenas uma operação assíncrona permitida por contexto por vez.
Portanto, você precisa fazer
await
um de cada vez, conforme a mensagem de erro sugere:var banner = await context.Banners.ToListAsync(); var newsGroup = await context.NewsGroups.ToListAsync();
Ou você pode usar vários contextos:
var banner = context1.Banners.ToListAsync(); var newsGroup = context2.NewsGroups.ToListAsync(); await Task.WhenAll(banner, newsGroup);
fonte
Se você estiver usando o contêiner IoC para a injeção do provedor de dados, considere o uso do tipo "transiente" ou "PerWebRequest" para o seu ciclo de vida.
Por exemplo: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
fonte
Se você usar o Unity para injeção de dependência com, por exemplo, padrão de repositório, você receberá o seguinte erro usando dois ou mais contextos com criar / atualizar / excluir:
Isso pode ser resolvido usando
PerRequestLifetimeManager
. Mais informações aqui:C # EF6 faz várias chamadas assíncronas para um contexto usando Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager()); container.RegisterType<ISupplierRepository, SupplierRepository>(); container.RegisterType<IContactRepository, ContactRepository>();
fonte