c# - 什么是 Winforms 中的 parking 窗口

标签 c# .net winforms

这是此答案的后续问题 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/

相关文章:

c# - GDI+ 就像在 WPF 中绘图一样

c# - 在 PropertyGrid 控件中显示集合

c# - 如何在 ViewModel 中获取控件的高度

c# - 如何允许在 asp.net 的文本框中提交 HTML 标记?

c# - 如何将我的应用程序添加到 Windows Vista/7 的默认程序列表中?

c# - Rx 分组节流

C# Winform 图表,x 轴显示日期和时间的缩放和刻度

c# - C# asp.net 中的夏令时区转换

c# - ASP.NET Mvc - System.Web.Compilation.CompilationLock

c# - 正则表达式捕获由初始定界符分隔的多个组