【问题标题】:Loop is taking around 10 minutes in vb循环在 vb 中大约需要 10 分钟
【发布时间】:2017-10-12 09:44:50
【问题描述】:
 For Each drow As DataGridViewRow In DgvItemList.Rows
            drow.Cells("strSrNo").Value = drow.Index + 1
        Next

我在 DgvItemList 中有超过 3500 条记录。我只是给这些记录编号,但它需要 9 到 10 分钟。

如何减少这个时间?

【问题讨论】:

  • stackoverflow.com/questions/5817632/…,也许吧?不过,Windows 消息使其特定于 Windows。
  • 怎么做?
  • 你到底想做什么?如:为什么您需要将看起来像某种序列号的东西分配给已经在网格中的数据?编辑:另外,您的网格是否绑定到 DataTable 或其他东西?
  • 是的,数据是由数据表绑定的。我只需要给行编号。
  • 您声明 DGV 已绑定到 DataTable。您真的需要存储在 DataTable 中的行号还是 Display Only 要求?如果仅用于显示,则可以使用未绑定的列并在代码中绘制行号。如果您保留当前代码,请在循环之前确定“strSrNo”的列索引并使用循环中的值;这将防止在每次迭代时查找列索引。

标签: windows vb.net winforms loops


【解决方案1】:

两件事。每次更改值时,都可能导致 DataGridView 更新,因此在循环之前,添加

DgvItemList.SuspendLayout

在循环之后,添加

    DgvItemList.ResumeLayout

您还可以将循环更改为 Parallel.For 循环,因此您的最终代码将类似于

DgvItemList.SuspendLayout 
Parallel.For(0, DgvItemList.Rows.Count, Sub(index As Integer)
                                        DgvItemList.Rows(index).Cells("strSrNo").Value = DgvItemList.Rows(index).Index + 1
                                            End Sub)
DgvItemList.ResumeLayout

首先尝试仅使用暂停和恢复布局。您可能不会从并行化中获得大量改进。不过值得一试。

【讨论】:

  • 不应该结束 Parallel 的条件。For 是行数减 1 吗?
  • 我从未使用过Parallel.For,但它不需要您在访问 UI 时调用,就像使用常规线程/任务一样?
  • @dwilliss 没有。只是为了迷惑人们,一个常规的 for.next 循环说从 0 到 100 会循环 101 次,但一个 parallel.for 循环只会从 0 到 99 执行,所以你不需要从最后的值中减去 1基于零的索引的情况。当然,另一方面,如果循环的结尾是从 array.getupperbound 获得的,则可能需要添加 1
  • @VisualVincent 也许吧,但我猜因为代码只更改数据并且可能不调用任何更改 UI 的方法,因此不存在跨线程问题。它似乎工作正常。如果你调用 .Update 方法之类的东西,它确实会挂起一个跨线程错误。
  • 但是TextBox.Text也是数据,但是它会抛出异常,因为它会导致文本框被重绘。更改单元格的值时也必须重新绘制它,因此我认为您通常也必须在此处调用(除非 DGV 具有不同的检测更改的方式)。
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2017-08-15
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多