Winforms的问题 – 创build窗口句柄时出错
我们在Winform应用程序中看到这个错误。 任何人都可以帮助你为什么会看到这个错误,更重要的是如何解决或避免它发生。
System.ComponentModel.Win32Exception:创build窗口句柄时出错。 在System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp) 在System.Windows.Forms.Control.CreateHandle() 在System.Windows.Forms.Control.CreateControl(布尔fIgnoreVisible) 在System.Windows.Forms.Control.CreateControl() 在System.Windows.Forms.Control.OnVisibleChanged(EventArgs e) 在System.Windows.Forms.ButtonBase.OnVisibleChanged(EventArgs e)
您是否运行Process Explorer或Windows任务pipe理器来查看GDI对象,句柄,线程和USER对象? 如果没有,请select要查看的列(任务pipe理器select视图 – >select列…然后运行您的应用程序,并看看那些应用程序的列,看看是否有一个真的很大。
这可能是因为您已经获得了您认为已经清理但尚未废弃的UI组件。
这里有一个关于这个可能有用的链接 。
祝你好运!
窗口句柄限制为您的应用程序是10,000个句柄。 你得到的错误是因为你的程序创build了太多的句柄。 你需要find内存泄漏。 正如其他用户所build议的那样,使用Memory Profiler。 我也使用.Net内存分析器。 此外,确保您在控件上调用dispose方法(如果在窗体closures之前将它们从窗体中移除)(否则控件将不会处理)。 您还必须确保没有向控件注册事件。 我自己有同样的问题,尽pipe我已经知道,我仍然有一些内存泄漏,继续逃避我..
看到我的这篇文章关于“错误创build窗口句柄” ,以及它如何与用户对象和桌面堆。 我提供一些解决scheme。
此问题几乎总是与GDI对象数,用户对象数或处理数有关,通常不是因为计算机上的内存不足。
当我跟踪这些错误之一时,我打开ProcessExplorer并观察这些列:句柄,线程,GDI对象,USER对象,专用字节,虚拟大小和工作集。
(根据我的经验,问题通常是由于事件处理程序持有对象并阻止对象处理而导致的对象泄漏。)
那么,在我的情况下,这绝对是失控的用户对象。 我查看了Windows任务pipe理器,果然,USER对象的数量恰好在10'000。
我通过将属性或列表表单的容器面板的Parent属性设置为Tab页面的属性,dynamic地将属性和列表表单embedded到Tab页面中。 我有条件地回收或重新创build属性和列表表单,具体取决于被列出的集合types或被检查对象的types。
注意:在Delphi中,所有控件都有一个Owner和一个Parent属性。 即使有人更改了控制权的“母体”属性,当拥有控制权被破坏时,仍由其所有者处置。
在C#中,似乎如果通过更改Panel.Parent属性将控件(例如Panel)以编程方式重新分配到Tab标签页,调用窗体上的Dispose()将不会处理Panel,也不会调用Controls清除选项卡上的()。 即使直接调用Panel.Dispose()也不会实际处理它,除非事先将它的Parent手动设置为null。
我认为这通常与计算机内存不足有关,所以无法创build更多的窗口句柄。 通常窗口在这一点上也开始显示一些奇怪的行为。
我添加了一个检查,使其工作…
if (_form.Handle.ToInt32() > 0) { _form.Invoke(method, args); }
它总是如此,但是没有它,表单会抛出一个错误。 顺便说一下,我的手柄是490万左右
我得到同样的错误在我的应用程序。我在单页中加载很多控件。button单击事件我正在清除控件。清除控件不释放内存控件。所以从内存中configuration控件。 我刚刚评论了controls.clear()方法,并包含几行代码来处置控件。 像这样的东西
每个ctl作为controlcollection中的控件
ctl.dispose()
下一个
绝对太多的句柄(内存泄漏问题):
IT丛林:System.ComponentModel.Win32Exception:创build窗口句柄时出错
内存不足的build议似乎不是一个坏主意。
你的程序在做什么,它会得到这个错误?
它创造了很多窗口或控件? 它是否以编程方式创build而不是在devise时? 如果是这样,你做这个循环? 那个循环是无限的吗? 你是否以其他方式消耗大量的记忆?
当您在任务pipe理器中观看应用程序使用的内存时会发生什么情况? 它飞到月球上吗? 或者更好的是,如上所述,使用过程监视器来深入细节。