2

我昨天遇到了这个异常:

Win32Exception: Fehler beim Erstellen des Fensterhandles

可能翻译:

Win32Exception:创建窗口句柄时出错

我知道如何解决这个问题(甚至写了一篇关于这个主题的简短博客文章- 用德语)

但我不知道我的应用程序可能在哪里“泄漏”未处置的控件,这些控件仍然具有窗口句柄。

有什么方法可以检测/查找实例

  • 实施IDisposable
  • Parent == null

匹配此约束的对象似乎是很好的候选对象。

4

3 回答 3

2

任何体面的内存分析器都会向您显示控制实例。它们不会被垃圾收集,它们的 Handle 属性使它们保持活力。其中将有近 10,000 个。您还可以使用任务管理器查看它,使用查看+选择列并勾选用户对象。在测试应用程序时观察计数增加应该会提供一个不错的提示。

代码审查也应该有很长的路要走,泄漏窗口的可能方法并不多。首先查找最常见的情况,即调用 Controls.Clear() 或 Controls.Remove/At() 但不释放控件的代码。下一个常见情况是 SystemEvents 类,您必须显式取消订阅它的事件。其余的不是那么容易找到,你需要那个分析器。

使用 Reflection 在运行时自己查找句柄在技术上是可能的。句柄存储在 System.Internal.HandleCollector.handleTypes[] 中。嗯,从技术上讲。

于 2009-12-14T16:08:15.040 回答
0

如果它们没有被收集是因为其他一些对象正在引用您的控件,那么调用 dispose 或将 parent 设置为 null 都不够。也许你是依附于事件而不是脱离它们。

特别检查从不被附件包含的控件附加到事件的情况,在这种情况下,您应该在处置控件时始终与事件分离,如果不是,该控件仍将继续被附件引用,因此它不会被发布

于 2009-12-14T16:25:31.500 回答
0

每个实现的对象IDisposable都有一个Dispose方法。当不再需要该对象时,应调用此方法。它是否仅在单个方法中使用,用using语句包围它(Dispose自动调用)。如果它是你的类的成员变量,你的类应该IDisposable自己实现。FxCop对此有一个检查规则。

于 2009-12-14T14:07:17.920 回答