C# 使用长数据源设置组合框

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

情况:如果数据库访问真的完成得非常快,超过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.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
不完全是我想要的,但帮助我不干扰主线程,并在显示进度条的同时在单独的线程中设置数据源。。。但经过一番讨论后,我终于说服我的客户不要有一个包含超长信息的组合,并做了一个搜索表单来处理这个问题。谢谢大家