Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms中的停车窗口是什么_C#_.net_Winforms - Fatal编程技术网

C# Winforms中的停车窗口是什么

C# Winforms中的停车窗口是什么,c#,.net,winforms,C#,.net,Winforms,这是这个答案的后续问题 我的印象是,Control类没有实现finailzer,这确实是真的,所以泄漏的控件将永远泄漏,而不是在最终确定期间清除 在评论部分给出一些提示,说明确实如此,以及一些关键字ParkingWindow。我在谷歌上搜索了那个关键词,找不到任何有用的资源 最后,我在System.Windows.Forms.Application.ParkingWindow中找到了一个名为ParkingWindow的类,通过反编译器,我无法理解该类的作用 看起来未登录的窗口将成为此parkin

这是这个答案的后续问题

我的印象是,
Control
类没有实现finailzer,这确实是真的,所以泄漏的控件将永远泄漏,而不是在最终确定期间清除

在评论部分给出一些提示,说明确实如此,以及一些关键字
ParkingWindow
。我在谷歌上搜索了那个关键词,找不到任何有用的资源

最后,我在
System.Windows.Forms.Application.ParkingWindow
中找到了一个名为
ParkingWindow
的类,通过反编译器,我无法理解该类的作用

看起来未登录的窗口将成为此parkingwindow的父窗口,稍后将被销毁,但不确定

问题是什么是停车窗,它的用途是什么


编辑:这与控件的终结或清理有什么关系?

这篇文章由Shawn Burke从MS:介绍

我们使用Windows窗体的目标之一是尽量平滑 Win32的奇特之处尽我们所能。其中一个主要的奇怪之处是 窗口句柄(HWND)管理和生存期。我们当然 不想让普通用户担心这些东西。在里面 大多数情况下,这很容易。你把全州的人都召集起来, 然后,当你真的需要显示窗口时,你可以 按需创建,然后将您的状态从HWND而不是 你的内部成员

嗯,这并不总是很有效。看,这是肯定的 Win32窗口的属性,一旦打开该窗口就无法更改 创建。例如,像边框的样式。所以允许 用户要在创建窗口后更改边框样式,请 需要重新创建句柄。这意味着你不仅需要拉 所有状态都将从现有状态中删除,但您需要 重新创建并将其推回。好吧,这不难

但是孩子们呢?哦,小提琴。孩子们

如果要修改边框的窗口有子窗口,则 它的句柄也会破坏所有子进程的句柄。 然后你需要重新创建它们,这是非常昂贵的。及 昂贵是不好的

进入停车窗口。停车窗是我们解决这个问题的办法 问题这是一个你可以“停车”的地方,直到你 适合他们的父母。把它想象成寄养的窗口, 但是看不见

所以在句柄重建的情况下,我们会检查是否有 任何孩子。如果有,我们会(如果需要)创建停车场 窗口,将子对象设为该对象的父对象,重新创建父对象的句柄, 然后把它们移回去。虽然管理了这个项目,但效果还是不错的 停车窗的使用寿命确实导致了一些问题

后来在某个时候被摧毁了但不确定

“不确定”是问题的症结所在。这种情况经常发生,因为窗户根本没有被破坏

Shawn Farka的博客文章很好地解释了停车窗的原意。必须重新创建子窗口的费用无疑是最重要的。不过,这并不是唯一的问题,某些类型的子窗口很难准确地重新创建。TreeView是一个很好的例子,有很多运行时状态与之关联。要准确地执行此操作,必须记录每个节点的折叠状态。这很痛苦,Winforms实际上并没有这样做。例如,当您重新分配复选框或StateMageList属性时,您将看到出现错误

总而言之,这是个好把戏,但他们玩得太过火了。重新创建父窗口时,子控件不仅(临时)出现在“停车”窗口上,而且在以下情况下也会移动到该窗口:

  • 您将其父属性设置为null
  • 使用父控件集合的Remove/At()方法
  • 使用父控件集合的Clear()方法
特别是在典型的Winforms程序中,最后两颗子弹几乎总是致命的。当程序员在运行时动态添加和删除控件时,往往会使用它们。问题是,该控件被重新托管在停车窗口上,但程序员只是忘记了它们,从而丢失了对该控件的引用。他们将永远住在那里。直到用户终止程序,因为它会因为创建了数千个窗口而变成缓慢的糖浆。或者程序因“创建窗口句柄时出错”而崩溃。当程序创建了10000个窗口后,Windows生气时就会发生这种情况


相反,需要调用控件的Dispose()方法。在.NET中,调用Dispose()通常是可选的,这在.NET中非常少见。不是在控件类的情况下,驻车窗口保留控件上的引用,从而阻止终结器运行。

请参阅谢谢,David。非常有趣的文章,你能不能像Hans说的那样,解释一下这和控件的最终确定有什么关系?我在这里遗漏了,这是另一个问题。我对此一无所知。你刚才问了什么是“停车窗”以及它的用途?重新创建窗口很困难,VCL设计师可能会弄错。在那里,控件确实存储了它们的状态并尝试恢复它。我猜WinForms的人是从VCL的经验中学到的。我不清楚这个驻车窗口是否会保留控件上的引用,从而阻止终结器运行我看不到控件类实现了析构函数,这里的终结器是什么意思?终结器在基类Component中。它实现了一次性模式,因此Dispose(bool)是运行的模式。NativeWindow中也有管道,它是包装的。它是。。。晦涩难懂的