Multithreading 在多线程应用程序中填充ListView
我需要从数据库中检索一组数据,然后用数据填充ListView。我了解多线程表单控件以及从工作线程更新控件的适当技术。这是一个两难的问题: 在ListView中我可能有几千个条目。。。我希望构建ListViewItem对象的集合并使用ListView.Items.AddRange(ListViewItemCollection),而不是调用表单线程一次更新一个对象 但是,MSDN文档建议不要创建自己的ListViewItemCollection(实际上,尝试创建自己的ListViewItemCollection会生成空引用错误,因为没有父集合)。相反,MS建议您只能通过ListView.Items属性获取ListViewItemCollection 当然,这是循环推理,如果不生成错误,则无法从工作线程执行:“跨线程操作无效:从创建控件的线程以外的线程访问控件‘ListView’。” 我可以使用重载的AddRange(ListViewItem[]),但在当今时代,数组相当笨拙Multithreading 在多线程应用程序中填充ListView,multithreading,listview,listviewitem,Multithreading,Listview,Listviewitem,我需要从数据库中检索一组数据,然后用数据填充ListView。我了解多线程表单控件以及从工作线程更新控件的适当技术。这是一个两难的问题: 在ListView中我可能有几千个条目。。。我希望构建ListViewItem对象的集合并使用ListView.Items.AddRange(ListViewItemCollection),而不是调用表单线程一次更新一个对象 但是,MSDN文档建议不要创建自己的ListViewItemCollection(实际上,尝试创建自己的ListViewItemColl
有人建议如何从工作线程向ListView添加数千项吗?我想您已经有了答案-AddRange(ListViewItem[])。如果您觉得数组不合适,可以使用列表,然后在调用AddRange时执行toArray()。没有想到先执行列表,这是个好主意。我很想知道哪一个性能更好,转换为数组的通用列表还是直接使用数组。如果我直接使用数组,我在添加完项后仍然需要调用Resize()(我不知道会有多少项),因此这两种方法最后都会将所有元素复制到数组中。。。这个列表甚至可能更快。使用ListViewItemCollection没有更好的方法,这让我感到惊讶。构建列表并将其复制到ListViewItem[]大约需要500毫秒,而直接使用ListViewItem[]需要600毫秒。明白我为什么不喜欢数组了吗?:)我的猜测是因为我不知道前面阵列的大小,我正在浪费时间为我不需要的阵列分配空间。