【问题标题】:Silverlight control not being garbage collected because of command由于命令,Silverlight 控件没有被垃圾收集
【发布时间】:2025-12-21 01:50:11
【问题描述】:

我的控制由于它所绑定的命令而保持活动状态。我怎样才能打破这个参考?这导致我的应用程序出现重大内存泄漏。该控件位于 DataTemplate 内部,因此我无法直接访问它。

这是我的 ANTS 内存配置文件:

我到底要如何断开这个连接?

【问题讨论】:

  • 很好,但到底是什么WeakEventListenerBase。它没有在任何地方实施或记录。 google.com/…
  • 如果您点击其中一篇文章中的链接,您会到达这里:blog.thekieners.com/2010/02/17/weakeventsource-implementation-2
  • 我已经看到了。我显然仍然缺少一些东西。关于WeakEventListenerBase 的内容不多。只是说它“是新的,因为需要重构才能获得 CreateWeakEventListener 方法返回值的非泛型声明。”什么是WeakEventListener?我是弱引用的新手。
  • 你说得对,我看错了源文件的标题。不确定他从哪里得到 WeakEventListenerBase,但他有另一个链接,其中 似乎 是类似实现的完整源代码:blog.thekieners.com/2010/02/11/…

标签: silverlight memory-leaks


【解决方案1】:

虽然我合并了WeakEventListener,但我发现我的问题在于我用来包装图像的控件。我将它连接到 DownloadProgressImageOpenedImageFailed 事件并且从未解开它们。我的想法是,我的代码中没有其他任何东西触及 BitmapImage 对象,因此它们将被控件收集为垃圾。它认为,情况并非如此。 BitmapImage 对象被微软代码中名为“ManagedPeerTable.PeggedManagedPeersWithRefs”的静态成员(因此也是 GC 根)引用。它是如此之深,以至于谷歌搜索只返回了五个结果。现在我想会有六个。

【讨论】: