【问题标题】:Populating a ListView in a multithreaded app在多线程应用程序中填充 ListView
【发布时间】:2009-10-11 03:54:09
【问题描述】:

我需要从数据库中检索一组数据,然后用这些数据填充 ListView。我了解多线程表单控件以及从工作线程更新控件的正确技术。这是两难的:

我可能在 ListView 中有几千个条目...而不是调用表单线程来一次更新它们,我想构建 ListViewItem 对象的集合并使用 ListView.Items.AddRange(ListViewItemCollection) .

但是,MSDN 文档建议不要创建自己的 ListViewItemCollection(实际上,尝试创建自己的 ListViewItemCollection 会生成空引用错误,因为没有父集)。相反,MS 建议您仅通过 ListView.Items 属性获取 ListViewItemCollection。

这当然是循环推理,不能在工作线程中完成而不产生错误:“跨线程操作无效:控制'ListView'从创建它的线程以外的线程访问。”

我可以使用重载的 AddRange(ListViewItem[]),但在当今时代,数组相当笨重。

有人建议如何从工作线程向 ListView 添加数千个项目?

【问题讨论】:

    标签: multithreading listview listviewitem


    【解决方案1】:

    我想你已经有了答案 - AddRange(ListViewItem[])。如果您发现数组令人反感,您可以使用 List,然后在调用 AddRange 时立即执行 toArray()。

    【讨论】:

    • 没想到先做一个列表,这是个好主意。我很想知道哪个性能更好,一个转换为数组的通用 List 或直接使用数组。如果我直接使用数组,当我完成添加项目时,我仍然必须调用 Resize() (我不知道我将拥有多少项目)所以这两种方法最终都将所有元素复制到一个数组中结束...列表甚至可能更快。令我惊讶的是,没有更好的方法来使用 ListViewItemCollection。
    • 构建 List 并将其复制到 ListViewItem[] 大约需要 500 毫秒,而直接使用 ListViewItem[] 需要 600 毫秒。明白我为什么不喜欢数组了吗? :) 我的猜测是因为我事先不知道数组的大小,所以我正在浪费时间为不需要的数组分配空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多