在另一个线程(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

在另一个线程(winforms)上用IEnumrable填充ListBox

您不需要在另一个线程中填充ListBox。如果您使用正确的方式填充它,则填充10000个条目需要很短的时间(对我来说是200-300毫秒)。

您可能想要放在另一个线程中的部分是加载数据而不是向ListBox添加数据。

要向ListBox添加物品,只需使用AddRange:

this.listBox1.AddRange(array);

相当于使用下面的代码。首先调用ListBoxBeginUpdate方法,然后使用一个循环到Add的项目到Items集合,最后调用EndUpdate:

this.listBox1.BeginUpdate();
foreach (var item in array)
{
    this.listBox1.Items.Add(item);
}
this.listBox1.EndUpdate();

查看AddRange方法的源代码