我使用parallel.forEach来访问多线程数据库。
我们说我们要插入200,000行,并且我使用20个线程
乐观地说,我只需要连接DB 20次,每个线程使用一个连接。
我认为如果我在循环中写dbconn.dispose()
,它将进行200,000连接。
但是我不能在外面写dbconn.dispose()
,它会说没有定义。
代码如:
myPallOpt.MaxDegreeOfParallelism=20;
parallel.forEach(source,myPallOpt,(oneRow)=>
{
myDataEntity dbconn= new myDataEntity();
// do data base job
// i don't like to write dbconn.dispose() here
});
//but can not use dbconn.dispose() here
答案 0 :(得分:2)
您可能希望使用允许您设置和拆除线程的Parallel.ForEach
重载。 http://msdn.microsoft.com/en-us/library/dd991486(v=vs.110).aspx有更多细节和示例。
适用于您的场景..
Parallel.ForEach(
input,
() => new DbConn(),
(i, loopState, dbConn) => {
// do stuff with dbConn here
//Pass the dbConn on to the next itteration.
return dbConn;
},
dbConn => dbConn.Dispose()
);
答案 1 :(得分:-1)
已经有一段时间了。
我认为Dean Ward的想法可能有用。
但我所做的是:
1,创建一个thread_ID和EF连接表(列表)
2,当循环到这个线程时,我检查这个线程是否在thread_talbe中。 如果没有创建新的EF连接,并将此线程ID和连接保存到thread_tale。
3,当作业完成后,循环关闭表中的所有EF连接。
代码:
create a thread vs EF table
Parallel.ForEach(.....)=>
{
if(thread NOT in thread table)
{
EF dbconn = new EF();
tread_table.add(this_thread_ID,dbconn)
}
do_oneThreadJOb(data someData,EF dbconn);
});
foreah( var one in thread_table)
{
thread_table[one].dispose();
}