Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在多线程应用程序中填充ListView_Multithreading_Listview_Listviewitem - Fatal编程技术网

Multithreading 在多线程应用程序中填充ListView

Multithreading 在多线程应用程序中填充ListView,multithreading,listview,listviewitem,Multithreading,Listview,Listviewitem,我需要从数据库中检索一组数据,然后用数据填充ListView。我了解多线程表单控件以及从工作线程更新控件的适当技术。这是一个两难的问题: 在ListView中我可能有几千个条目。。。我希望构建ListViewItem对象的集合并使用ListView.Items.AddRange(ListViewItemCollection),而不是调用表单线程一次更新一个对象 但是,MSDN文档建议不要创建自己的ListViewItemCollection(实际上,尝试创建自己的ListViewItemColl

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

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

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

当然,这是循环推理,如果不生成错误,则无法从工作线程执行:“跨线程操作无效:从创建控件的线程以外的线程访问控件‘ListView’。”

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


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

我想您已经有了答案-AddRange(ListViewItem[])。如果您觉得数组不合适,可以使用列表,然后在调用AddRange时执行toArray()。

没有想到先执行列表,这是个好主意。我很想知道哪一个性能更好,转换为数组的通用列表还是直接使用数组。如果我直接使用数组,我在添加完项后仍然需要调用Resize()(我不知道会有多少项),因此这两种方法最后都会将所有元素复制到数组中。。。这个列表甚至可能更快。使用ListViewItemCollection没有更好的方法,这让我感到惊讶。构建列表并将其复制到ListViewItem[]大约需要500毫秒,而直接使用ListViewItem[]需要600毫秒。明白我为什么不喜欢数组了吗?:)我的猜测是因为我不知道前面阵列的大小,我正在浪费时间为我不需要的阵列分配空间。