情况:数据库访问实际上非常快,超过0.3秒,但是在将数据源分配给组合时发生滞后,冻结超过1分钟。
问题:如何使用NO表单冻结设置组合框,非常长的数据源(超过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()方法中执行set datasource。 结果:什么都不做,组合没有元素。
B-使用BackGroundWorker并在RunWorkerCompleted()方法中执行set datasource。 结果:它实际上工作,但就像在主线程中调用集合,然后冻结表单。
C-使用BeginInvoke()方法
在另一个线程中设置Datasource结果:再次在主线程中完成工作并冻结应用程序
提前致谢。
答案 0 :(得分:0)
可能您可以尝试从其父控件集合中删除组合框,填充组合框并将其添加回父级。这样的事情:
var parent = comboBox.Parent;
parent.Controls.Remove(comboBox);
comboBox.DataSource = ds;
parent.Controls.Add(comboBox);