【发布时间】: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