1

我在数组中有各种 csv 文件的位置strFilePath(几乎 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;
}
4

1 回答 1

1

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

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

于 2015-02-03T06:30:01.410 回答