Это мой код:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Но когда я вызвал функцию из контроллера. Это показало ошибку
Вторая операция началась в этом контексте до завершения предыдущей асинхронной операции. Используйте await, чтобы убедиться, что все асинхронные операции завершены, прежде чем вызывать другой метод в этом контексте. Потокобезопасность любых членов экземпляра не гарантируется.
Пожалуйста, помогите мне решить эту проблему.
Ответы:
Исключение ясно объясняет, что одновременно разрешена только одна асинхронная операция для каждого контекста.
Итак, вы должны либо обращаться к
await
ним по одному, как следует из сообщения об ошибке:var banner = await context.Banners.ToListAsync(); var newsGroup = await context.NewsGroups.ToListAsync();
Или вы можете использовать несколько контекстов:
var banner = context1.Banners.ToListAsync(); var newsGroup = context2.NewsGroups.ToListAsync(); await Task.WhenAll(banner, newsGroup);
источник
Если вы используете контейнер IoC для внедрения поставщика данных, подумайте об использовании типа «переходный» или «PerWebRequest» для своего жизненного цикла.
Например: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
источник
Если вы используете Unity для внедрения зависимостей, например, с шаблоном репозитория, вы получите следующую ошибку, используя два или более контекстов с create / update / delete:
Это можно решить с помощью
PerRequestLifetimeManager
. Больше информации здесь:C # EF6 выполняет несколько асинхронных вызовов одного контекста с помощью Unity - Asp.Net Web Api
container.RegisterType<DbContext>(new PerRequestLifetimeManager()); container.RegisterType<ISupplierRepository, SupplierRepository>(); container.RegisterType<IContactRepository, ContactRepository>();
источник