我有一个ListView
超过一百万的控件ListViewItems
。每个ListViewItems
包含两个字符串。我正在提取Windows机器的所有注册表项——路径 + 键名和数据。
当我尝试调用ListView.CheckedItems.Count
时,它不会像我期望的那样快速返回(我已经测试了几天运行它等待它响应)。起初我以为我遇到了某种类型的锁争用问题,但是,当我降低控件中的条目数时,该方法会返回。奇怪的是,遍历列表所需的时间似乎每100,000个条目增加一倍:
- 100,000需要00:45返回。
- 200,000需要03:58返回。
- 300,000需要09:31返回。
- 400,000需要17:08才能返回。
- 500,000需要26:56才能返回。
遍历项目以查看它是否被“检查”不应该花这么长时间,即使有500,000个条目,对吧?可能发生了什么,是否有解决方法?
系统信息:
Windows 10 Enterprise 64 位(已于 2017 年 9 月 11 日全面修补) 32GB Ram Visual Studio 2017 .NET Framework 4.6.1
运行时使用的内存量徘徊在5GB左右。CPU 利用率可以忽略不计——在Sysinternals ProcessExplorer中查看这个程序表明,在计算检查项目计数的值时,单个线程以大约12%的速度运行。
该应用程序是一个简单的windows 窗体。如果在调试器模式下单步执行或直接运行发布构建的二进制文件,则会发生延迟。