WeakReference的线程安全性

时间:2009-11-06 11:34:48

标签: c# .net weak-references

使用WeakReference时,我们怎样才能确定在.IsAlive和.Target调用之间没有收集目标?

例如:

if (myWeakReference.IsAlive)
{
    // How can we be sure the object is still alive while here?
    ((MyType)myWeakReference.Target).Foo();
}

3 个答案:

答案 0 :(得分:25)

只需获取Target并检查它是否为空:

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

docs for IsAlive具体说:

  

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

答案 1 :(得分:4)

“IsAlive”属性的唯一目的是,如果WeakReference的目标已经被销毁,你想要采取某些行动的情况,但你不想冒险意外地保持它的活动时间超过必要的时间。如果有人说,例如

  if (someWeakReference.Target == null)
    cleanup_related_object();

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

  if (!someWeakReference.IsAlive)
    cleanup_related_object();

没有意外延长某些WeakReference目标的目标生命周期的风险

答案 2 :(得分:2)

你做不到。将myWeakReference.Target分配给变量,并检查是否为空。