C# 使用长数据源设置组合框
情况:如果数据库访问真的完成得非常快,超过0.3秒,但是将数据源分配给组合时会出现延迟,冻结超过1分钟 问题:如何设置组合框,非常长的数据源(超过100000个注册表),没有表单冻结 实际代码:C# 使用长数据源设置组合框,c#,multithreading,linq,combobox,datasource,C#,Multithreading,Linq,Combobox,Datasource,情况:如果数据库访问真的完成得非常快,超过0.3秒,但是将数据源分配给组合时会出现延迟,冻结超过1分钟 问题:如何设置组合框,非常长的数据源(超过100000个注册表),没有表单冻结 实际代码: var q = from c in DataContext.MyTable select new { Name = c.Name, Id = c.Id }; IQueryable datasource = q;//q.Count()>100,000 this.comboBox1.DisplayM
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;
技术:
我正在使用.NETFramework 4.5.51
VS2013
已尝试:
A-使用BackgroundWorker并在DoWork()方法中设置数据源。
结果:如果不执行任何操作,则组合不会获得任何元素
B-使用BackGroundWorker并在RunWorkerCompleted()方法中设置数据源。
结果:它实际上可以工作,但就像在主线程中调用集合一样,然后也冻结了表单
C-使用BeginInvoke()方法在不同的线程中设置数据源
结果:再次在主线程中完成工作并冻结应用程序
提前谢谢 您可以尝试从其父控件集合中删除组合框,填充组合框并将其添加回父控件。诸如此类:
var parent = comboBox.Parent;
parent.Controls.Remove(comboBox);
comboBox.DataSource = ds;
parent.Controls.Add(comboBox);
我猜这个组合是在UI线程中定义的。因此,向它添加一个大集合肯定会导致某种“滞后”。您是否可以对组合的结果进行分页?还是懒洋洋地加载它们?我认为你需要重新考虑你的策略来填充这个组合。我怀疑试图在一个组合中输入100000个条目是个问题。我敢肯定,您可以在其中一个列表中输入的数据量是有限制的,而且在任何情况下,您是否真的希望用户在一个组合中拖拽如此多的条目?您说数据库访问非常快,但您如何知道w/o实现查询,这实际上是在您将其指定为数据源时发生的。您是否测量过
var list=q.ToList()代码>时间,然后.DataSource=list
时间?如果第一部分很慢,那么您可以将其移动到另一个线程,或者使用async/await
不完全是我想要的,但帮助我不干扰主线程,并在显示进度条的同时在单独的线程中设置数据源。。。但经过一番讨论后,我终于说服我的客户不要有一个包含超长信息的组合,并做了一个搜索表单来处理这个问题。谢谢大家