更新外部循环

时间:2014-09-14 04:49:47

标签: c# datatable parallel-processing parallel.foreach parallel.for

我在strFilePath数组中有各种csv文件的位置(几乎1000个文件,每个文件中有100万条记录)。从文件中读取并将所有数据合并到单个数据表需要花费大量时间。所以我决定继续进行并行处理。

当前代码

DataTable dtMerge=new DataTable();
for(int i=0;i<strFilePath.Count;i++)
{
     Parallel.For(0, 3,m =>
     {
         clsNewClass objCls=new clsNewClass();
         DataTable dt=objCls.ReadCSV(strFilePath[m+i]);
     });
     m+=3;
}

问题是,如何将数据表dt中的所有数据合并到全局数据表dtMerge,或者可以将所有结果包含到全局变量dtMerge

预计代码工作

DataTable dtMerge=new DataTable();
for(int i=0;i<strFilePath.Count;i++)
{
     Parallel.For(0, 3,m =>
     {
         clsNewClass objCls=new clsNewClass();
         // Is it possible like the below?
         dtMerge = objCls.ReadCSV(strFilePath[m+i]);
     });
     m+=3;
}

1 个答案:

答案 0 :(得分:1)

使用Parallel.For(或ForEach)的重载为您提供本地初始化程序,最后为线程使用,这样您就可以在不使用锁的情况下合并进度内部线程。然后,您可以使用锁定线程安全地将finally块中的内部线程表merge放入外部表中。

DataTable dtMerge = new DataTable();

Parallel.ForEach(strFilePath,
     () => new DataTable(),
     (filePath, loopState, local) =>
     {
         clsNewClass objCls=new clsNewClass();
         // Is it possible like the below?
         var dt = objCls.ReadCSV(filePath);
         local.Merge(dt, true, MissingSchemaAction.Add);
         return local;
     },
     (local) =>
     {
         lock(dtMerge)
         {
             dtMerge.Merge(local, true, MissingSchemaAction.Add);
         }
     });

我也摆脱了你的外部for循环,用一个平行的foreach替换了你的内部循环,没有理由像这样嵌套你的循环,只需使用ForEach