如何在完成工作后处理并行创建的所有实体?forEach?

时间:2014-06-19 22:50:51

标签: c# multithreading entity-framework

我使用parallel.forEach来访问多线程数据库。

我们说我们要插入200,000行,并且我使用20个线程

乐观地说,我只需要连接DB 20次,每个线程使用一个连接。

我认为如果我在循环中写dbconn.dispose(),它将进行200,000连接。

但是我不能在外面写dbconn.dispose(),它会说没有定义。

那么我怎么能写一些像"完成200,000行"?

后处理所有连接

代码如:

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 

2 个答案:

答案 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();

}