事件处理程序和GC.在stackoverflow上阅读相互矛盾的答案

本文关键字:相互矛盾 答案 stackoverflow 程序 GC 事件处理 | 更新日期: 2023-09-27 18:17:53

我刚才读到Silverlight UI没有取消订阅PropertyChanged事件。这正是我现在的问题。我尝试了答案中提出的实验。答案是正确的,它们是通过显式GC收集的。

然而,这又导致了两个问题:

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

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

仅在发布者停止存在时才有资格进行GC是常识。但是这个常识与Silverlight UI没有取消订阅PropertyChanged事件的答案中的实验相矛盾,这证明了当且仅当垃圾收集发生时,Silverlight UI对PropertyChanged事件的订阅停止存在。我更相信事实而不是常识。但这个事实该如何解释呢?weakref吗?

事件处理程序和GC.在stackoverflow上阅读相互矛盾的答案

两个相连问题的答案并不矛盾;由于事件订阅是对实例方法的委托,因此事件发布者维护对订阅者的间接引用,因此在发布者符合收集条件之前,订阅者将不符合收集条件。第二个链接的答案仅仅意味着垃圾收集器足够聪明,可以处理循环引用(因为GC操作基于"GC根"的可达性,而不是简单的引用计数)。

如果你问的是基于XAML的环境(如Silverlight或WPF)如何在UI元素仍然绑定到非视觉元素的情况下收集UI元素垃圾,那么答案就在于XAML绑定是如何工作的。

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