【发布时间】:2017-08-26 21:46:37
【问题描述】:
我正在使用 asp.net mvc 5 构建一个网站。
目前我正在使用依赖注入将每个请求的 dbcontext 注入到我的控制器中。
但 EF 不是线程安全的,因此一个 dbcontext 不能用于并行查询。
是否值得对我的网站进行更改,让这个页面像这样使用 smt?
using(var ctx = new dbcontext) {
//creating a task query like tolistasync
}
using(var ctx2 = new dbcontext) {
//creating a task query like tolistasync
}
using(var ctx3 = new dbcontext) {
//creating a task query like tolistasync
}
.
.
.
.
.
.
.
using(var ctx20 = new dbcontext) {
//creating a task query like tolistasync
}
然后:
Task.WhenAll(t1,t2,t3,......,t20)
或者我应该对每个请求只使用一个 dbcontext 并执行以下操作:
var query1result = await query1.ToListAsync();
var query2result = await query2.ToListAsync();
var query3result = await query3.ToListAsync();
var query4result = await query4.ToListAsync();
.
.
.
.
.
var query19Result = await query19.ToListAsync();
var query20Result = await query20.ToListAsync();
在第一种情况下,与 db 的打开和关闭连接会非常多。
第二个会有一个连接,但一切都是按顺序发生的
哪种情况更好,为什么?
【问题讨论】:
-
如果您将上下文包装在
using中,我认为它们中的任何一个都不会起作用,因为这将在异步任务完成之前关闭连接。 -
我知道我这样做只是为了澄清问题
标签: c# asp.net-mvc entity-framework task-parallel-library