如何加快ListView的处置

Posted

技术标签:

【中文标题】如何加快ListView的处置【英文标题】:How to speed up the disposal of a ListView 【发布时间】:2021-02-16 04:51:13 【问题描述】:

如何加快 ListView 控件的处置速度?

一点背景知识:这个解决方案使用的是 MaterialSkin,所以我的可用控件列表是有限的(例如,没有 ListBox 或 DataGridView)。其次,列表中的项目数量多得不合理(平均 51k,一列或两列,具体取决于设置),所以我并不期待闪电般的速度,但也不是我所看到的。

当表单关闭时,我不需要列表中的任何内容。它已经达到了它的目的,并且可以消失。这是我尝试过的:

Close();                    --- 16 seconds (just closing the form)

MyListView.Dispose();       --- 16 seconds

MyListView.Items.Clear();   --- 16 seconds

MyListView.Clear();         --- 17 seconds

MyListView.BeginUpdate();
MyListView.Items.Clear();   --- 16 seconds

实际上,我尝试过的每个选项大约需要 16 秒才能摆脱列表。现在,填充列表大约需要 16 秒,这也是我正在研究的问题——但至少有一些时间是合理的,因为我用太多的记录来超载这个糟糕的列表。在那里,我知道 ListView 必须处理放置项目的开销。在移除方面,没有那么多。

注意:表单是通过 ShowDialog 显示的——所以在 16 秒结束之前不会返回控制。一个后备计划是在对话框正在关闭的过程中使用 Show 并触发一个事件。

是的,我认为显示 51k 条记录是糟糕的 UI,并且已多次向客户解释过;目前,坚持 51k 记录存在。 (我确实添加了全文搜索,否则......)

【问题讨论】:

如果您尝试使用沼泽标准 ListView 加载相同的数据会发生什么?我的猜测是性能会如你所料。无论如何,MaterialSkin 已经死了:github.com/IgnaceMaes/MaterialSkin#state-of-the-project 您应该继续使用受支持并提供您需要的所有控件的 UI 框架,例如开发快递。您将需要付费,但您将获得实际执行正常的控件。 有趣的想法。尝试换掉控件。同样的表现——但这确实回答了我昨天的一个问题,所以值得一试。 ListView 控件有一个虚拟模式,允许您仅在实际显示这些项目时从源加载项目。一个例子here 使用虚拟方法,而不是加载约 16 秒,关闭约 16 秒,我现在加载 1-3 秒,关闭 500 毫秒。它带来了很多怪癖(我如何处理选择并确保我不会超出数据的末尾等),但速度非常值得其他更改。让大多数事情以更合理的速度再次运行。客户得到他们的 51k 条记录。 @Ian Kemp 我想我已经解释了我链接的那篇文章中的所有内容。它包括基本的虚拟模式功能、标准项目检索、搜索功能——这也构建了SelectedIndexes 集合。我应该在这里重复〜相同的代码和注释。或者专注于 MaterialSkin 实现:您注意到没有维护,但比这更糟糕:ListView 是所有者绘制的并且代码已经泄漏;万一出现异常,任何图形对象都不会被处理掉。所有自定义控件都是如此。但我真的不想谈论这个。 【参考方案1】:

隐藏你的列表视图怎么样?尝试将它的可见属性设置为 false,当您不再需要列表视图时尝试关闭表单而不清除您的列表视图

【讨论】:

对此抱有希望 - 不幸的是,仍然在 16 秒时出现。在上面添加编辑,此表单正在使用 ShowDialog 显示,因此在时间结束之前不会返回控件。一个备用方案是使用 Show 和 events。 您是否尝试过使用Backgroundworker?不幸的是,我还没有尝试过,所以我无法帮助您,但这可能是您正在寻找的东西 BackgroundWorker 可能是我最终选择的地方。这是个好主意。【参考方案2】:

您是否尝试过使用数据绑定而不是直接使用 Listview.Items? 因此,您可以将 ItemsSource 设置为 null,然后(异步?)清空实际的 List。

【讨论】:

以上是关于如何加快ListView的处置的主要内容,如果未能解决你的问题,请参考以下文章

C# 调用 ListView 不起作用(后台线程)

C# listview如何复制选中的多行内容

如何得到listview中有多少列数据?

android listview中如何将获取来的数据添加至listview尾部

winform c# listview 如何 选中行!急!在线等!

winform c# listview 如何 选中行!急!在线等!