实体框架6中的多异步?

An *_* Hv 84 asynchronous entity-framework entity-framework-6

这是我的代码:

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);
Run Code Online (Sandbox Code Playgroud)

但是当我从控制器调用该函数时.它显示错误

在先前的异步操作完成之前,在该上下文上开始第二操作.使用'await'确保在此上下文上调用另一个方法之前已完成任何异步操作.任何实例成员都不保证是线程安全的.

请帮我解决这个问题.

Ste*_*ary 114

该例外清楚地解释了一次只允许每个上下文一个异步操作.

因此,您可能需要await一次一个,因为错误消息表明:

var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();
Run Code Online (Sandbox Code Playgroud)

或者您可以使用多个上下文:

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);
Run Code Online (Sandbox Code Playgroud)

  • 只是一个注释,如果你有一个使用查询中的上下文的Lazy变量,即使使用等待它会抛出相同的错误,只需在查询之前获取属性,找到这个很痛苦. (31认同)
  • @ Pedro.The.Kid:作为一般规则,不要使用延迟加载和异步数据库访问.延迟加载始终是同步的,因此使用包含或单独查询其他数据要好得多. (7认同)