【问题标题】:Event Handler and GC. Read contradicting answers on stackoverflow [closed]事件处理程序和 GC。阅读关于stackoverflow的矛盾答案[关闭]
【发布时间】:2011-12-13 03:34:09
【问题描述】:

我刚才读到了Silverlight UI not unsubscribing from PropertyChanged events。这正是我遇到的问题。我尝试了答案中提出的实验。答案是正确的,它们是在显式 GC 时收集的。

但是,这会导致另外两个问题:

  1. 这似乎与 stackoverflow 上关于事件处理程序和 GC 的这两个线程相矛盾:12。他们错了吗?
  2. 这是如何实现的?我记得Java中有一种叫做弱引用的东西。有关系吗?

以下是对问题的一些澄清:

只有在出版商不复存在时才有资格获得 GC 是常识。但是这个常识与Silverlight UI not unsubscribing from PropertyChanged events 的答案中的实验相矛盾,这证明当且仅当垃圾回收发生时,Silverlight UI 对 PropertyChanged 事件的订阅不复存在。我相信事实胜于常识。但如何解释这个事实呢?弱引用?

【问题讨论】:

  • (1) 的接受答案有 53 个赞成票。它出错的可能性有多大? (尤其是考虑到经常访问该网站的人的能力)。
  • @MitchWheat 我完全同意你关于两个人回答了这些问题的观点。但是,当且仅当垃圾回收发生时,Silverlight UI 对 PropertyChanged 事件的订阅怎么会不复存在呢?
  • 致那些试图结束这个问题的人。在尝试关闭它之前阅读我的问题!并发表评论以证明您的决定。

标签: c# silverlight data-binding


【解决方案1】:

这两个相关问题的答案并不矛盾;因为事件订阅是实例方法的委托,所以事件发布者维护了对订阅者的间接引用,因此在发布者有资格收集之前,订阅者将没有资格收集。第二个链接的答案只是意味着垃圾收集器足够聪明,可以处理循环引用(因为 GC 是根据“GC Root”的可达性而不是简单的引用计数来操作的)。

如果您要问的是基于 XAML 的环境(如 Silverlight 或 WPF)如何在 UI 元素仍绑定到非可视元素时对其进行垃圾收集,那么答案就在于 XAML 绑定的工作原理。

冒着过度简化实际上非常复杂的系统(整个 XAML 绑定)的风险,XAML 绑定确实在其绑定源上使用 WeakReference 类型来允许对该对象进行垃圾回收。

【讨论】:

  • 只有在发布者不复存在时才有资格使用 gc 是常识。但是这个常识与Silverlight UI not unsubscribing from PropertyChanged events 的答案中的实验相矛盾,这证明当且仅当垃圾回收发生时,Silverlight UI 对 PropertyChanged 事件的订阅不复存在。我相信事实胜于常识。但如何解释这个事实呢?弱引用?
  • @Gene:这不仅仅是常识,而是事实。我在我的答案中添加了处理 Xaml 绑定细节的信息,但您提供的答案都没有矛盾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2017-02-07
  • 2012-11-25
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 2021-11-18
相关资源
最近更新 更多