阻止调用冻结AddRange上的表单

时间:2017-03-13 07:44:09

标签: c# winforms combobox

我有一个大型数据库(100,000+),我需要用其中一列的数据填充一个Combobox

这是我现在的代码

FastecData db = ConnectionHelper.CreateConnection(CurrentLocation);

List<Fakturor> t = db.Fakturor.OrderBy(z => z.FaktNr).ToList();


List<string> st = new List<string>();
foreach (var item in t)
{
    _busy.WaitOne();
    st.Add(item.FaktNr);
}
st.OrderBy(x => x.Length);

comboBoxFaktNr1.Invoke((Action)(() =>
{
    comboBoxFaktNr1.Items.AddRange(st.ToArray());
}));
comboBoxFaktNr2.Invoke((Action)(() =>
{
     comboBoxFaktNr2.Items.AddRange(st.ToArray());
}));

这是作为后台工作者运行的。 我对此代码的问题是,当它运行.Items.AddRange(st.ToArray());时 表单停止响应约10秒。有没有办法防止表格冻结?

1 个答案:

答案 0 :(得分:2)

以下代码应该执行您在代码中执行的所有操作:

FastecData db = ConnectionHelper.CreateConnection(CurrentLocation);
var t = db.Fakturor.Select(z => z.FaktNr).OrderBy(z => z).ToArray();

comboBoxFaktNr1.Invoke(new Action(() => {
  int x = 0;
  while(t.Length - x > 0)
  {
    var t2 = t.Skip(x).Take(Math.Min(t.Length - x, 1000));
    comboBoxFaktNr1.Items.AddRange(t2);
    comboBoxFaktNr2.Items.AddRange(t2);
    x += 1000;
    Application.DoEvents();
  }
}));

但是你应该再考虑在组合框中使用100K物品是对人类的犯罪。考虑多级过滤以将项目数量减少到可用的大小。