这是我的代码:
var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
但是当我从控制器调用该函数时。它显示错误
在上一次异步操作完成之前,在此上下文中启动了第二个操作。使用'等待'确保在调用此上下文中的另一个方法之前已完成任何异步操作。不保证任何实例成员都是线程安全的。
请帮我解决这个问题。
答案 0 :(得分:112)
该异常清楚地解释了每次只允许一个异步操作。
因此,您需要一次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);
答案 1 :(得分:4)
如果您使用IoC容器进行数据提供者注入,请考虑使用" transient"或者" PerWebRequest"输入你的生命周期。
例如:https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md
答案 2 :(得分:2)
如果使用Unity进行依赖注入,例如存储库模式,则使用create / update / delete两个或多个上下文会出现以下错误:
无法定义两个对象之间的关系,因为 它们附加到不同的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>();