是否有一种方法可以使填充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在加载时冻结。希望有人可以帮助我。谢谢!
答案 0 :(得分:0)
您使用的查询包含随机顺序。在MySQL中,随机排序记录可能是一个巨大的性能问题,因为它必须遍历表中的所有记录,然后对它们进行随机排序。表中的记录越多,性能损失越大。查询中的记录数也没有限制。因此,如果表中有成千上万个项目,则列表框中的大小也将成千上万,这可能需要很长时间。
如果您确实需要随机排序,则可以在代码中对此进行一些处理。我现在在这里假设您是:1)在表中使用标识符,2)您实际上希望限制列表框中的项目数,而不是全部显示。
希望这可以帮助您找到解决方案
答案 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