【问题标题】:Set combobox with long datasource使用长数据源设置组合框
【发布时间】:2016-03-25 01:50:54
【问题描述】:

情况:如果完成数据库访问实际上非常快,超过 0.3 秒,但是将数据源分配给组合时出现延迟,冻结超过 1 分钟。

问题:如何设置组合框、非常长的数据源(超过 100,000 个注册表)且不会冻结表单。

实际代码:

var q = from c in DataContext.MyTable
select new { Name = c.Name, Id = c.Id };
IQueryable datasource = q;//q.Count()>100,000

this.comboBox1.DisplayMember = "Name";
this.comboBox1.ValueMember = "Id";
this.comboBox1.DataSource = datasource;

技术: 我正在使用.Net Framework 4.5.51 用VS2013

已经试过了:

A-使用 BackgroundWorker 并在 DoWork() 方法中设置数据源。 结果:什么都不做,组合没有元素。

B- 使用 BackGroundWorker 并在 RunWorkerCompleted() 方法中设置数据源。 结果:它确实有效,但就像在主线程中调用集合一样,然后也冻结了表单。

C- 使用 BeginInvoke() 方法在不同的线程中设置数据源

结果:工作再次在主线程中完成并冻结应用程序

提前致谢。

【问题讨论】:

  • 我的猜测是组合是在 UI 线程中定义的。因此,向其中添加一个大集合肯定会导致某种“滞后”。您可以对组合的结果进行分页吗?还是懒加载它们?我认为您需要重新考虑填充此组合的策略。
  • 我怀疑尝试将 100,000 个条目放入一个组合是问题所在。我确定您可以放入其中之一的数据量是有限制的,无论如何您是否真的希望用户在一个组合中搜索这么多的条目?
  • 您说数据库访问速度非常快,但是您怎么知道没有具体化查询,这实际上是在您将其分配为数据源时发生的。您是否测量了var list = q.ToList(); 时间,然后测量了.DataSource = list 时间?如果第一部分很慢,那么你可以把它移到另一个线程,或者使用async/await

标签: c# multithreading linq combobox datasource


【解决方案1】:

也许您可以尝试从其父控件集合中删除组合框,填充组合框并将其添加回父级。类似的东西:

        var parent = comboBox.Parent;
        parent.Controls.Remove(comboBox);
        comboBox.DataSource = ds;
        parent.Controls.Add(comboBox);

【讨论】:

  • 不完全是我想要的,但帮助我没有弄乱主线程,并且在显示进度条的同时将数据源设置在单独的线程中......但经过一番交谈后,我终于说服了我客户不要与那些超长的信息组合,并做了一个搜索表格来管理问题。谢谢大家
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2012-04-18
相关资源
最近更新 更多