使用长数据源设置组合框

时间:2015-12-18 11:04:14

标签: c# multithreading linq combobox datasource

情况:数据库访问实际上非常快,超过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

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

可能您可以尝试从其父控件集合中删除组合框,填充组合框并将其添加回父级。这样的事情:

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