【发布时间】:2021-10-20 23:45:25
【问题描述】:
我有一个表单,我想在其中添加大约数千个标签,但它总是为创建窗口句柄提供异常。 我正在处理一些标签并创建更多控件,但我找不到任何解决方法。
我将它们处理为:
track.Tablature.Controls.OfType<Control>().ToList().Where(t => getNotes.Select(z => z).Contains(t.Name) || getLabels.Contains(t.Tag) || getLabels.Contains(t.Name) || getLabels.Contains(t.Name)).ToList().ForEach(z =>
{
track.Tablature.Controls.Remove(z);
z.Dispose();
});
GC.SuppressFinalize(this);
here is the error 至少它应该允许我添加 10000 个控件,但它会在 4500 个控件时给出错误
【问题讨论】:
-
我的 Ryzen 7-5800X Windows 10-x64 16GB 与 VS2017 .NET Framework 4.7.2 使用
for 10000 add new label在 9972 个标签处崩溃。看看Windowless controls are not magic • Pushing the Limits of Windows: Handles • How to increase windows UI resource limit • GDI Objects -
“数千个标签” 可能是一个糟糕的解决方案。用户一次需要这么多吗?我怀疑是这样。对于列表,有专门的控件,您甚至可以使用虚拟化来减少影响。
-
@OlivierRogier 哈哈,您缺少 ram 正在影响您的判断。 scarm.info/blog/wp-content/uploads/2016/09/OutOfMemory.png
-
10000 是您可以创建的最大句柄数。之后,系统可能会决定是时候终止应用程序了,这显然是行为不端。 --
Controls.Clear()没有清除任何东西,它只是从集合中删除现有控件的引用。所有创建的控件仍然非常活跃(它们的句柄也是如此)。没有可能的理由来创建这么多控件。设计错误。