我在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;
}
答案 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