【发布时间】:2020-04-07 06:39:25
【问题描述】:
我正在使用 parallel.for 在数据表上循环。循环中改变的值是 cirNumb,我用这个值查询一个数据表来填充一个IEnumerable<DataRow> 类型的对象。然后我调用一个结构的实例,我必须将此集合IEnumerable<DataRow> 传递给结构。在结构内部,我使用以前的集合来填充数据表,但我发现有时结果是正确的,有时不是,我想错误在于将 IEnumerable<DataRow> 分配给数据表。
这里有一些代码:
Parallel.For(0, dtCir.Rows.Count, (i, state) =>
{
int cirNumb = Convert.ToInt32(dtCir.Rows[i]["no_of_circuits"]);
IEnumerable<DataRow> dtConnectionSizeLoop = from dtConn in
dtConnectionDatabase.AsEnumerable().AsParallel()
where dtConn.Field<Int32>("no_of_circuits") == cirNumb
CalculateDC calcDC;
calcDC = new CalculateDC();
calcDC.SetParameters(...,dtConnectionSizeLoop,...);
//do some stuffs
}
struct SetParameters 方法做了一些事情,并将对象 IEnumerable<DataRow> 分配给数据表:
DataTable var_dtConnectionSize = dtConnectionSize.CopyToDataTable();
有人可以帮帮我吗?
【问题讨论】:
-
让我们退后一步。你为什么要考虑使用
Parallel根本?如果只使用普通循环(没有Parallel或AsParallel),代码需要多长时间才能运行? -
我使用它是因为我在 SetParameters 方法中有一些密集的数学演算,通过这种方式我可以并行化这些操作。使用普通循环,时间约为 60 秒。
-
先加载数据,并行计算,再存入数据库
标签: c# multithreading datatable thread-safety parallel.for