这是此答案的后续问题 https://stackoverflow.com/a/20584601/2530848 .
我的印象是 Control
类没有实现 finailzer,这确实是真的,所以泄漏的控件会永远泄漏,不会在完成期间清除。
Hans Passant在评论部分给出一些提示说它确实如此,还有一些关键字 ParkingWindow
。我用该关键字进行了 google 搜索,找不到任何有用的资源。
最后我通过反编译器在 System.Windows.Forms.Application.ParkingWindow
中找到了一个名为 ParkingWindow
的类,我无法理解它正在做什么.
看起来没有父级的窗口将成为这个 parking 窗的父级,并在稍后的某个时候被销毁,但不确定。
问题是 ParkingWindow
到底是什么以及它的用途是什么?
编辑:这与控件的完成或清理有何关系?
最佳答案
and destroyed later at some point but not sure
“不确定”是问题的关键。这经常出错,因为窗口根本没有被破坏。
Shawn Farka 的博文很好地解释了 parking 窗口的初衷。必须重新创建子窗口的费用肯定排在首位。虽然不是唯一的问题,但某些类型的子窗口非常难以准确地重新创建。 TreeView 是一个很好的例子,有相当多的运行时状态与之关联。为了准确地做到这一点,您必须记录每个节点的折叠状态。这很痛苦,而 Winforms 实际上并没有这样做。例如,当您重新分配 CheckBoxes 或 StateImageList 属性时,您会发现这是错误的。
总而言之,这是一个不错的把戏,但他们用得太过火了。当父窗口被重新创建时,子控件不仅(暂时)结束在 parking 窗口上,它还会在以下情况下移动到那里:
- 您将其 Parent 属性设置为 null
- 您使用父控件集合的 Remove/At() 方法
- 您使用父控件集合的 Clear() 方法
特别是最后两个项目符号在典型的 Winforms 程序中几乎总是致命的。当程序员在运行时动态添加和删除控件时,往往会使用它们。问题是,控件在 parking 窗口上重新托管,但程序员只是忘记了它们,失去了对控件的引用。他们将永远住在那里。直到用户终止程序,因为它会因为创建了数千个窗口而变成缓慢的糖蜜。或者程序因“创建窗口句柄错误”而崩溃。当程序创建了 10,000 个窗口后 Windows 变得闷闷不乐时,就会发生这种情况。
相反,需要调用控件的 Dispose() 方法。通常在 .NET 中非常不寻常,调用 Dispose() 始终是可选的。不是在 Control 类的情况下,Parking Window 保留对控件的引用,从而阻止终结器运行。
关于c# - 什么是 Winforms 中的 parking 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20585012/