none
关于弱引用的一个问题 RRS feed

  • 问题

  • 使用弱引用前都要先判断该弱引用是否还有效,如果有效,才能使用。那么会不会发生这样的情况:在判断的时候,该弱引用还是有效的,刚判断完就突然发生了垃圾回收使该弱引用失效了,这样的话,以后的执行将出现错误。那么我说的这种情况到底有没有可能发生呢?(尽管概率很小)

    如果有可能发生的话,有没有更安全地使用弱引用的方法?

    2010年11月10日 6:26

答案

  • 你好 通过MSDN上的说明我们可以得知:你说的情况是可能发生的。

    “由于在 IsAlive 属性返回 true 之后,可能会立即通过垃圾回收来回收对象,因此不建议使用此属性(除非仅对 false 返回值进行测试)。”

    http://msdn.microsoft.com/zh-cn/library/system.weakreference.isalive.aspx


    所以即便你判断了IsAlive 也需要对Target进行判断 如果为null 那么说明已经被回收了


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    • 已标记为答案 062369 2010年11月10日 11:27
    2010年11月10日 7:42
    版主
  • 这种情况是完全可能发生的。但概率非常小,因为在垃圾回收时,所有执行进程中的用户线程会被全部挂起,直到 CLR 完成垃圾回收后,所有进程才开始继续执行,在这个期间,WeakReference 的 Target 可能会被垃圾回收,因此会导致此值为 null。目前没有好的方法回避这个问题,弱引用的使用原则就是不 care 对象的有效性。如果您需要考虑对象的有效性,则直接用强引用,或者 GC.KeepAlive 或者 GCHandle 的 Pinned 模式。
    Mark Zhou
    • 已标记为答案 062369 2010年11月10日 11:27
    2010年11月10日 9:38

全部回复

  • 你好 通过MSDN上的说明我们可以得知:你说的情况是可能发生的。

    “由于在 IsAlive 属性返回 true 之后,可能会立即通过垃圾回收来回收对象,因此不建议使用此属性(除非仅对 false 返回值进行测试)。”

    http://msdn.microsoft.com/zh-cn/library/system.weakreference.isalive.aspx


    所以即便你判断了IsAlive 也需要对Target进行判断 如果为null 那么说明已经被回收了


    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    • 已标记为答案 062369 2010年11月10日 11:27
    2010年11月10日 7:42
    版主
  • 这种情况是完全可能发生的。但概率非常小,因为在垃圾回收时,所有执行进程中的用户线程会被全部挂起,直到 CLR 完成垃圾回收后,所有进程才开始继续执行,在这个期间,WeakReference 的 Target 可能会被垃圾回收,因此会导致此值为 null。目前没有好的方法回避这个问题,弱引用的使用原则就是不 care 对象的有效性。如果您需要考虑对象的有效性,则直接用强引用,或者 GC.KeepAlive 或者 GCHandle 的 Pinned 模式。
    Mark Zhou
    • 已标记为答案 062369 2010年11月10日 11:27
    2010年11月10日 9:38