C# 有没有长时间弱引用的实例?

C# 有没有长时间弱引用的实例?,c#,weak-references,C#,Weak References,有人有“长”弱引用(而不是短引用)的实际例子吗 这仅用于内部使用吗?与通常的看法相反,Finalize不会导致对象被垃圾收集。相反,如果发现该对象没有强根引用,则注册的终结器将阻止该对象立即被垃圾收集。相反,该对象将被添加到一个强根对象列表中,该列表中的Finalize方法应在第一时间运行。发生这种情况时,对对象的所有短弱引用都将无效,但长弱引用不会无效 如果一个对象有两个或多个必须按特定顺序解构的对象,那么最后一个必须解构的对象引用必须首先解构的对象可能会有所帮助。这应该是某种形式的弱引用,以

有人有“长”弱引用(而不是短引用)的实际例子吗


这仅用于内部使用吗?

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

如果一个对象有两个或多个必须按特定顺序解构的对象,那么最后一个必须解构的对象引用必须首先解构的对象可能会有所帮助。这应该是某种形式的弱引用,以便前一个对象(最后解构的对象)不会不必要地延长后一个对象的生存期(必须在它之前解构),但如果它是一个短的弱引用,它将在需要之前变得不可用。使它成为一个长的弱引用可以避免这个问题

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

  • 它有一个
    WeakReference
    ,其中包含对早期连接对象的引用,它仍然很好。在这种情况下,代码应该简单地开始使用它

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

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


第一种情况可以通过short
WeakReference
处理。确定第二个或第三个应用需要一个长的
WeakReference
。请注意,一旦一个连接排队等待完成,连接管理器就不会对尝试重用它感兴趣,但仍然必须知道它的存在。

非常感谢。回答得很好。它还回答了我在本周初提出的另一个问题。我在Stack Overflow上问了几个问题,但这个答案是我收到的最好的答案之一。非常感谢。在您假设的连接管理器场景中,我如何从长WeakReference判断对象是否计划完成(即,我如何区分案例1和案例3)?我只需要一个目标为非空的WeakReference对象,但是我怎么知道它处于什么状态呢?@MikeMarynowski:一种方法是使用两个弱引用,一个长引用和一个短引用。如果短的终止了,但长的仍然有效,则该对象已计划运行其终结器。