在另一个线程(winforms)上用IEnumrable填充ListBox
本文关键字:上用 IEnumrable 填充 ListBox winforms 另一个 线程 | 更新日期: 2023-09-27 18:05:58
我想知道什么是最好的方式来填充一个WinForm的ListBox控件,填充取决于一个单选btn?
我看到一些建议使用foreach来循环遍历列表中的每个对象,并将它们添加到listBox.items.Add()中,但这似乎是一个非常糟糕的主意,因为rabio btn 1的列表返回一个包含10,000条记录的列表(需要一些时间来循环,并且UI在循环时冻结,坏的坏主意)。
是否有更好的方法来做到这一点,也许在一个单独的任务来阻止UI冻结?
private void PopulateListBox()
{
foreach (var item in Controller.ReturnBigResultSet())
this.Invoke((MethodInvoker)(() => listBox1.Items.Add(item)));
}
UPDATE:代码块使用adrange:
var watch = new Stopwatch();
watch.Start();
var list = Controller.GetAllEntries().ToArray();
Debug.WriteLine("List returned in {0}s with a size of {1}", watch.Elapsed.TotalSeconds, list.Count<Lejlighed>());
watch.Restart();
listBox1.Items.AddRange(list);
watch.Stop();
Debug.WriteLine("Added {0} items in {1}s", listBox1.Items.Count, watch.Elapsed.TotalSeconds);
输出是:
List returned in 3.8596527s with a size of 19022
Added 19022 items in 1.9223412s
您不需要在另一个线程中填充ListBox
。如果您使用正确的方式填充它,则填充10000个条目需要很短的时间(对我来说是200-300毫秒)。
您可能想要放在另一个线程中的部分是加载数据而不是向ListBox
添加数据。
要向ListBox
添加物品,只需使用AddRange
:
this.listBox1.AddRange(array);
相当于使用下面的代码。首先调用ListBox
的BeginUpdate
方法,然后使用一个循环到Add
的项目到Items
集合,最后调用EndUpdate
:
this.listBox1.BeginUpdate();
foreach (var item in array)
{
this.listBox1.Items.Add(item);
}
this.listBox1.EndUpdate();
查看AddRange
方法的源代码