更快地填充列表框

时间:2019-03-08 08:22:08

标签: mysql vb.net

是否有一种方法可以使填充ListBox的速度更快,因为UI在填充ListBox时冻结了表单加载?

这是我的表单加载代码:

Dim abc As String = itemCount()
Dim output = Account_Get(a)
For Each s In output
    ListBox1.Items.Add(s)
    count1 += 1
    If count1 = abc Then
        ListBox1.Visible = True
    End If
Next

这是模块中的查询:

Public Function Account_Get(ByVal chk As String) As List(Of String)
    Dim result = New List(Of String)()

    Try
        cn.Open()
        sql = "select column_name as str from table where status = 'New' order by rand()"
        cmd = New MySqlCommand(sql, cn)
        dr = cmd.ExecuteReader
        While dr.Read
            result.Add(dr("str").ToString())

        End While
        Return result

    Catch ex As Exception
        MsgErr(ex.Message, "Error Encounter")
        Return Nothing
    Finally
        cn.Close()
    End Try

End Function

这很好。但是它加载了太多数据的事实。 ui在加载时冻结。希望有人可以帮助我。谢谢!

2 个答案:

答案 0 :(得分:0)

您使用的查询包含随机顺序。在MySQL中,随机排序记录可能是一个巨大的性能问题,因为它必须遍历表中的所有记录,然后对它们进行随机排序。表中的记录越多,性能损失越大。查询中的记录数也没有限制。因此,如果表中有成千上万个项目,则列表框中的大小也将成千上万,这可能需要很长时间。

如果您确实需要随机排序,则可以在代码中对此进行一些处理。我现在在这里假设您是:1)在表中使用标识符,2)您实际上希望限制列表框中的项目数,而不是全部显示。

  1. 通过查询了解表中的记录总数
  2. 从表格中的项目范围中选择一个随机数
  3. 获取最近的记录

希望这可以帮助您找到解决方案

答案 1 :(得分:0)

由于您要增加count1,所以我认为它是某种数字。但是,然后将其与If语句中的字符串进行比较。请使用Option Strict。

已更改函数以返回字符串数组。采取了sql语句的随机排序方式,并将其移至最后的linq或函数中。

您可以将秒表添加到数据检索和显示部分,以查看瓶颈所在。列表框上的BeginUpdate和EndUpdate防止每次添加时重新绘制。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim output = Account_Get()
    ListBox2.BeginUpdate()
    ListBox2.Items.AddRange(output)
    ListBox2.EndUpdate()
End Sub

Private Rand As New Random

Public Function Account_Get() As String()
    Dim dt As New DataTable
    Dim result As String()
    Using cn As New MySqlConnection("Your connection string")
        Dim Sql = "select column_name as str from table where status = 'New'" 'order by rand()"
        Using cmd = New MySqlCommand(Sql, cn)
            Try
                cn.Open()
                dt.Load(cmd.ExecuteReader)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Error Encounter")
                Return Nothing
            End Try
        End Using
    End Using
    result = (From dRow In dt.AsEnumerable()
              Let field = dRow("str").ToString
              Order By Rand.Next
              Select field).ToArray
    Return result
End Function