2009-11-06 18 views
15

Al usar una WeakReference, ¿cómo podemos estar seguros de que el destino no se recopila entre las llamadas .IsAlive y .Target?Seguridad de subprocesos de WeakReference

Por ejemplo:

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

Respuesta

25

acaba de obtener el Target y comprobar si no es nulo:

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

El docs for IsAlive dice específicamente:

Debido a que un objeto podría ser potencialmente reclamado para recolección de basura inmediatamente después de que la propiedad IsAlive devuelve verdadero, usando esta propiedad es no recomendado a menos que esté probando solo para un valor de retorno falso.

2

No puede. Asigna myWeakReference.Target a una variable y busca null.

4

El único propósito de la propiedad "IsAlive" es para situaciones donde desea realizar alguna acción si el objetivo de una WeakReference ya ha sido destruido, pero donde no desea arriesgarse accidentalmente a mantenerlo con vida más tiempo del necesario . Si tuviera que decir, p.

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

y el recolector de basura fueron (por cualquier razón) gatillo derecho después del código que evalúa someWeakReference.Target, el GC se daría cuenta de que existía una fuerte referencia a ese objeto y se opone a su colección. Por otro lado, diciendo:

 
    if (!someWeakReference.IsAlive) 
    cleanup_related_object(); 

no habría riesgo de prolongar la vida útil de forma accidental el objetivo de orientar someWeakReference

Cuestiones relacionadas