我有一个大型数据库(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秒。有没有办法防止表格冻结?
答案 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物品是对人类的犯罪。考虑多级过滤以将项目数量减少到可用的大小。