Mysql 更快地填充列表框

Mysql 更快地填充列表框,mysql,vb.net,Mysql,Vb.net,有没有办法使填充列表框更快,因为在填充列表框时,UI在表单加载时会冻结 这是我的表单加载代码: Dim abc As String=itemCount() Dim输出=账户获取(a) 对于输出中的每个s ListBox1.Items.Add(s) count1+=1 如果count1=abc,则 ListBox1.Visible=True 如果结束 下一个 这是模块中的查询: Public Function Account\u Get(ByVal chk作为字符串)作为列表(字符串) Dim结

有没有办法使填充
列表框
更快,因为在填充
列表框
时,UI在表单加载时会冻结

这是我的表单加载代码:

Dim abc As String=itemCount()
Dim输出=账户获取(a)
对于输出中的每个s
ListBox1.Items.Add(s)
count1+=1
如果count1=abc,则
ListBox1.Visible=True
如果结束
下一个
这是模块中的查询:

Public Function Account\u Get(ByVal chk作为字符串)作为列表(字符串)
Dim结果=新列表(字符串)()
尝试
cn.Open()
sql=“从表中选择列名称作为str,其中status='New'order by rand()
cmd=新的MySqlCommand(sql,cn)
dr=cmd.ExecuteReader
当雷德博士
result.Add(dr(“str”).ToString())
结束时
返回结果
特例
MsgErr(例如消息“遇到错误”)
一无所获
最后
cn.Close()
结束尝试
端函数

这很好用。但事实是它加载了太多的数据。用户界面在加载时冻结。希望有人能帮我。谢谢

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

如果你真的需要随机排序,你可以在你的代码中做一些事情。我现在假设您是:1)在表中使用标识符,2)您实际上希望限制列表框中的项目数量,而不是显示所有项目

  • 通过查询掌握表中记录的总数
  • 从表中的项目范围中选择一个随机数
  • 取最近的记录

  • 希望这能帮助您找到解决方案

    因为您正在递增count1,我假设它是某种数字。但是,然后将其与If语句中的字符串进行比较。请使用选项严格

    将函数更改为返回字符串数组。从sql语句中获取随机排序,并将其移动到函数末尾的一个小linq

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

    Private Sub Form1\u Load(发送方作为对象,e作为事件参数)处理MyBase.Load
    Dim output=Account\u Get()
    ListBox2.BeginUpdate()
    ListBox2.Items.AddRange(输出)
    ListBox2.EndUpdate()
    端接头
    作为新随机变量的私有Rand
    公共函数Account_Get()作为字符串()
    Dim dt作为新数据表
    将结果设置为字符串()
    将cn用作新的MySqlConnection(“您的连接字符串”)
    Dim Sql=“从状态为'New''的表中选择列名称作为str,按rand()排序”
    使用cmd=newmysqlcommand(Sql,cn)
    尝试
    cn.Open()
    dt.Load(命令执行器读取程序)
    特例
    MessageBox.Show(例如消息“遇到错误”)
    一无所获
    结束尝试
    终端使用
    终端使用
    结果=(来自dt.AsEnumerable()中的dRow)
    Let field=dRow(“str”).ToString
    兰德订购,下一个
    选择字段)
    返回结果
    端函数
    
    为了将来的参考,请在提交之前查看问题的预览,如果问题一团糟,请不要提交。创建一个
    数据表
    ,调用其
    加载
    方法,并传递数据读取器将查询结果集加载到
    数据表
    。设置
    列表框的
    显示成员
    >对于要显示的列的名称,然后将
    DataTable
    分配给
    DataSource
    属性。@jmcilhinney为什么不回答而不是注释?@DanielE.,因为在我看来,我发布的内容不够完整,不能作为答案。注释说明了应该做什么,但实际上没有做什么,而答案应该可以。我没有发布这样的答案,因为我想让OP调动他们的大脑,为他们自己编写代码。然后他们可以根据这些代码回答自己的问题。不要在UI线程上做工作,开始一个新的线程,创建一个任务等等。有很多改进是可以做的,并且是离题的,一个,如果需要的话to
    Account\u Get
    不返回任何内容,那么调用方将轰炸输出中的每一个s;
    ,特别是这一行,因为它什么都不是……我知道如何限制。我需要加载所有数据,这就是我在查询中没有使用限制的原因。顺便问一下,为什么这一行选择str)。ToArray给我一个错误。很抱歉,我更改了一个few变量名称在最后一分钟。它应该是
    选择字段)。ToArray
    我已经更正了答案中的代码。顺便说一句,我用大约1500条记录的表进行了测试,它填充了列表框,并在眨眼之间加载了表单。只有我的测试是在SQL Server和本地db上进行的。我尝试了你的代码,现在加载速度更快,但仍然是ui freeze仍然存在。可能是因为我加载了近百万条记录。仅供参考,我之所以加载如此大的数据是因为我将使用它进行抽奖。再次感谢!哇!一个用户怎么可能与一个有一百万条记录的列表框交互。你一定有一台内存丰富的计算机。