2013-12-17 3 views
69

Это мой код:Multi-async в Entity Framework 6?

var banner = context.Banners.ToListAsync() 
var newsGroup = context.NewsGroups.ToListAsync() 
await Task.WhenAll(banner, newsGroup); 

Но когда я назвал функцию от контроллера. Он показал ошибку

Вторая операция началась в этом контексте до завершения предыдущей асинхронной операции. Используйте «ждут», чтобы убедиться, что какие-либо асинхронные операции были выполнены до вызова другого метода в этом контексте. Любые члены экземпляра не гарантируют безопасность потоков.

Пожалуйста, помогите мне решить эту проблему.

+6

Исключение кристально ясно, что вы спрашиваете? –

+0

У меня есть 2 задачи. Если я запускаю каждую задачу. это успех. но если я буду работать, как мой код выше. Это ошибка –

ответ

91

Исключение объясняет, что существует только одна асинхронная операция за каждый разрешенный контекст за раз.

Таким образом, вы должны либо 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); 
+0

это работа. Большое спасибо. –

+25

просто примечание, если у вас есть переменная Lazy, которая использует контекст в запросе даже с ожиданием, что она выкинет ту же ошибку, просто получите свойство перед запросом, было больно узнать об этом. –

+7

@ Pedro.The.Kid: Как правило, не используйте ленивую загрузку с асинхронным доступом к БД. Ленивая загрузка всегда синхронна, поэтому гораздо лучше использовать Include или отдельные запросы для дополнительных данных. –

1

Если вы используете Unity для инъекции зависимостей с для шаблона пример репозитория вы получите следующее сообщение об ошибке с помощью двух или более контекстов создания/обновления/удаления:

Взаимоотношения между двумя объектами нельзя определить, потому что прикреплены к различным объектам ObjectContext.

Это можно решить, используя PerRequestLifetimeManager. Более подробная информация здесь:

C# EF6 make multiple async calls to one context using Unity - Asp.Net Web Api

container.RegisterType<DbContext>(new PerRequestLifetimeManager()); 
container.RegisterType<ISupplierRepository, SupplierRepository>(); 
container.RegisterType<IContactRepository, ContactRepository>();