【发布时间】:2019-08-13 19:43:46
【问题描述】:
我是初学者 C# 编码器,所以我对任务或线程一无所知。我写了这段代码,我想使用某种并行或线程处理。
代码包含在两个 DataTable (A & B) 中,我必须将 A 的每个单元格值与 B 的所有单元格进行比较。B 包含一列和几行。 A 可以是数百万个单元格。我使用 for 循环来做到这一点。这是我想并行化以加快进程的代码部分:
private DataTable CalculosPrincipales(DataTable Prof, DataTable Prop, DataTable Rango)
{
DataTable dt = new DataTable();
dt.Columns.Add("Prof Evaluar", typeof(double));
dt.Columns.Add("Profundidad", typeof(double));
dt.Columns.Add("Promedio", typeof(double));
dt.Columns.Add("Sumatoria", typeof(double));
dt.Columns.Add("n", typeof(double));
if (int.TryParse(box_Z.Text, out int z))
{
}
var step = (progressBar.Properties.Maximum - (Int32)progressBar.EditValue)/z;
for (int i = 0; i < Rango.Rows.Count-1; i++)
{
dt.Rows.Add(Rango.Rows[i][0], Rango.Rows[i][1], 0, 0 , 0);
}
double prof_celda;
double prof_rango;
double prop_celda;
for (int i = 0; i < Prop.Rows.Count; i++)
{
for (int j = 0; j < Prop.Columns.Count; j++)
{
prop_celda = Convert.ToDouble(Prop.Rows[i][j]);
if (prop_celda != nullvalue)
{
for (int k = 0; k < Rango.Rows.Count; k++)
{
prof_celda = Convert.ToDouble(Prof.Rows[i][j]);
prof_rango = Convert.ToDouble(Rango.Rows[k][0]);
if (prof_celda < prof_rango)
{
dt.Rows[k][3] = Convert.ToDouble(dt.Rows[k][3]) + prop_celda;
dt.Rows[k][4] = Convert.ToInt32(dt.Rows[k][4]) + 1;
break;
}
}
}
}
progressBar.PerformStep();
Application.DoEvents();
}
for (int i = 0; i < dt.Rows.Count; i++)
{
if (Convert.ToInt32(dt.Rows[i][4]) == 0)
{
dt.Rows[i].Delete();
i -= 1;
}
}
return dt;
}
如果表格 A 有 10000 个单元格,此代码运行速度很快,200000 个单元格需要 5 分钟,1000000 个需要 20 分钟。
【问题讨论】:
-
对于初学者,
Application.DoEvents();删除该行 -
同意@Çöđěxěŕ,
Application.DoEvents()使您的 UI 具有响应性,但它也可能导致奇怪的副作用。考虑使用BackgroundWorker组件来完成工作(并让它将进度编组回 UI 线程)。你如何填充你的数据表?可能有一种填充它们的方法不需要您正在进行的所有转换? -
数据表是从外部 txt 文件中填充的...我正在读取每一行,然后拆分这些行并将每个项目分配给数据表中的一个单元格。
-
正如我之前所说,我不是编码员,这是一种爱好,我自学 C#,我显示进度条的最佳解决方案是 doevents,这里有人建议,因为我的知识水平,它对我有用。我根本不了解后台工作人员。很高兴知道怎么做,但还没有弄清楚。
-
很有可能并行化这样一个简单的数学运算会使其变慢而不是变快,线程并不“便宜”,相反,您应该首先改进算法以减少运算次数然后您应该查看核心操作以使其高效。您还可以查看是否可以使用可以矢量化的操作。在您完成所有操作后,您可能不需要使用线程来添加和比较简单的数值。
标签: c# parallel-processing task-parallel-library