2013-10-31 28 views
3

相关:EntityFramework (6) and async (waitingForActivation)?每个ToListAsync打开DbContext最终会阻塞连接池吗?

但是,它没有解决等待多个项目,只有一个。我的目标是继续沿着这条

var car = db.Cars.ToListAsync(); 
var people = db.People.ToListAsync(); 
Task.WhenAll(car,people); 

有所建树不幸的是,我得到这个运行时异常(我应该真正知道)

开始在这个背景下,以前的异步操作完成之前第二次手术。在调用此上下文中的另一个方法之前,请使用'await'来确保任何异步操作已完成。任何实例成员不保证是线程安全的。

数据库上下文不是线程安全的。好的。因此,现在我正在考虑将调用分解为方法,然后等待两个方法调用(或者一个简单的演示方法,就是将上面显示的每个db调用打包到using(db){}声明中)。无论如何,问题在于使用该模式时,每个ToListAsync需要一个新的DbContext。

对每个ToListAsync调用使用DbContext会对连接池造成威胁吗?这是反模式吗?

+0

它不会对线程池造成威胁,因为它不使用线程池,而是使用IO完成端口。你当然会有更多的数据库连接,如果数据库已经很忙,你的数据库可能无法更快地处理这个问题。 –

+0

@KrisVandermotten - **连接**游泳池。当前连接到数据库的数量。我没有在这里提到线程池:) –

+0

的确,我的错误。你当然会有更多的连接,每个DbContect有效。尽管如此,它们都将被收集起来以备后用。 –

回答

4

对每个ToListAsync调用使用DbContext会对连接池造成威胁吗?

它将使用每个DbContext一个连接。根据您的情况,这可能会超额订阅,或者可能不会。它很大程度上取决于数据库的预期使用情况和功能。

这是反模式吗?

不一定。这会给DB带来更大的压力,因为它将同时执行两个查询。好处是你潜在增加客户端(在这种情况下,ASP.NET是客户端到数据库)的吞吐量,这可能超过额外的压力。衡量是真正了解这些好处是否超过数据库压力的唯一途径。