弱引用的线程安全性

问题描述 投票:0回答:1

[使用WeakReference时,如何确定在.IsAlive和.Target调用之间未收集目标?

例如:

if (myWeakReference.IsAlive)
{
    // How can we be sure the object is still alive while here?
    ((MyType)myWeakReference.Target).Foo();
}
c# weak-references
1个回答
25
投票

只需获取Target,然后检查它是否不为空:

object target = myWeakReference.Target;
if (target != null)
{        
    ((MyType)target).Foo();
}

docs for IsAlive具体说:

因为一个对象可能是回收用于垃圾收集在IsAlive属性之后返回true,使用此属性是不推荐,除非您正在测试仅用于错误的返回值。


4
投票

“ IsAlive”属性的唯一目的是在以下情况下:如果WeakReference的目标已被破坏,则要采取某些措施,但又不想冒意外地使它的生存期超过必要的风险。如果有人要说,例如

如果(someWeakReference.Target == null)cleanup_related_object();

并且垃圾收集器将(出于任何原因)在评估someWeakReference.Target的代码之后立即触发,GC将注意到存在对该对象的强大引用,并阻止了其收集。另一方面,说:

如果(!someWeakReference.IsAlive)cleanup_related_object();

不存在意外延长someWeakReference目标的目标寿命的风险


2
投票

你不能。将myWeakReference.Target分配给变量,然后检查是否为空。

© www.soinside.com 2019 - 2024. All rights reserved.