【问题标题】:How to reduce the time delay for loading the large datasource in the CheckedListBox?CheckedListBox中如何减少加载大数据源的时间延迟?
【发布时间】:2017-07-26 09:46:07
【问题描述】:

当我将 CheckedListBox 的 DataSource 设置为 10lack 项时。它的应用程序仍然是理想的长达 3 分钟。

List<string> list = new List<string>();
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += ((o, a) =>
{             
    //1Lakh unique records.
    for (int i = 0; i < 100000; i++)
        list.Add("Item" + i);
});
worker.RunWorkerCompleted += ((obj, ea) =>
{
    //Assign the 1Lack records to the CheckedListBox.

    //>>Here is the UI gets hanged.(Need to wait more than 10 - 20 seconds to gets the response)
    checkedListBox1.DataSource = list;                
});
worker.RunWorkerAsync();

有没有办法优化加载选中列表框中项目的时间延迟。

【问题讨论】:

  • 它是 foreach 循环中唯一的一行代码,还是您还有其他代码?为什么你首先需要 10lac 项目在 ui 中?你不能使用分页吗?
  • 您希望有人搜索您的一百万个项目并检查一些吗?在显示项目之前,您应该考虑使用不同的控件或过滤数据源。
  • @ChetanRanpariya 我只使用此行来加载项目。
  • 为什么要在列表框中加载 100 万个项目?您能解释一下您要实现的功能吗?
  • 使用BeginUpdate / EndUpdate 方法。

标签: c# winforms performance checkedlistbox


【解决方案1】:

List、Dictionary 和其他动态扩展的集合可以从预定义的大小中受益匪浅。如果您知道您将在其中放入约 100 万个项目,请在 List-constructor 中将大小设置为 100 万。或者,如果您有固定大小,请使用数组。但您面临的真正问题可能是缓慢的 GUI 更新。我不熟悉 CheckedListBox 控件,但如果它支持虚拟化,你应该启用它。但我认为不会。如 cmets 中所建议的,另一种方法是以较小的批次填充控件并允许 GUI 在其间更新。与其一次性设置 DataSource,不如在 DoWork 中尝试以大约 100 个项目的批量添加它们。您可能必须在主线程上调用它。您也可以尝试在主线程上直接执行所有这些操作,并在批次之间使用 DoEvents 并查看是否可以。可能不如异步方法好,但值得一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多