长期弱参考的任何实际例子?

Eri*_*let 16 c# weak-references

有没有人有一个"长"弱参考(不短)的实际例子?

这仅供内部使用吗?

sup*_*cat 16

与普遍看法相反,Finalize不会导致对象被垃圾收集.相反,如果发现没有强根带引用,则注册的终结器将阻止对象立即被垃圾收集.相反,该对象将被添加到一个根深蒂固的对象列表中,这些对象的Finalize方法应该在第一次运行时运行.当发生这种情况时,对象的所有短弱引用都将失效,但长弱引用不会.

如果一个人有两个或两个以上必须以特定顺序解构的对象,那么最后必须解构的对象可能有助于引用必须首先被解构的对象.这应该是某种形式的弱引用,因此前一个对象不会不必要地延长前一个对象的生命周期,但如果它是一个短的弱引用,它将在它需要之前变得不可用.使其成为一个长期的弱参考可以避免这个问题.

更一般地说,短的弱引用适用于一个人只想知道某个对象是否处于可用状态的情况,而一个长的弱引用通常适用于需要知道一个对象而不管它是什么的情况.州.作为另一个示例,假设远程数据库服务器一次只能与一个连接对象接口,并且连接对象具有终结器,该终结器通知远程服务器不需要其服务.如果放弃连接对象并尝试重新连接同一服务器,则连接管理器必须能够处理三种情况:

  • 它有一个WeakReference持有对早期连接对象的引用,它仍然很好.在这种情况下,代码应该只是开始使用它.

  • 早期的连接对象的终结器已运行完成,远程服务器已准备好进行新连接.在这种情况下,代码应该只是创建一个新的连接对象.

  • GC注意到连接对象已被放弃,并已安排完成,但终结器尚未运行完成.在这种情况下,代码必须确保在建立新连接之前清除旧连接.

第一种情况可以通过简短处理WeakReference.确定第二个或第三个适用需要很长时间WeakReference.请注意,一旦连接入队以进行最终确定,连接管理器就不会对尝试重用它感兴趣,但仍然必须意识到它的存在.

  • @MikeMarynowski:一种方法是使用两个弱引用,一个是长引用,一个是短引用.如果短的一个已经死亡但是长的一个仍然有效,则该对象已经被安排运行其终结器. (2认同)