2009-11-06 12 views
15

Wie können wir bei Verwendung einer WeakReference sicher sein, dass das Ziel nicht zwischen den .IsAlive- und .Target-Aufrufen erfasst wird?Threadsicherheit von WeakReference

Zum Beispiel:

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

Antwort

25

einfach die Target bekommen und prüfen, ob es nicht null ist:

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

Die docs for IsAlive speziell sagen:

Da ein Objekt möglicherweise sein könnte zurückgefordert für Müllabfuhr direkt nach dem IsAlive -Eigenschaft gibt True zurück, mit dieser Eigenschaft ist nicht empfohlen, es sei denn, Sie testen nur für einen falschen Rückgabewert.

2

Sie können nicht. Weisen Sie myWeakReference.Target einer Variablen zu und überprüfen Sie, ob der Wert null ist.

4

Der einzige Zweck der "IsAlive" -Eigenschaft ist für Situationen, in denen Sie etwas unternehmen möchten, wenn das Ziel einer WeakReference bereits zerstört wurde, aber nicht versehentlich länger als nötig am Leben bleiben soll . Wenn man sagen würde, z.B.

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

und der Müll-Sammler waren (aus irgendeinem Grund) Trigger direkt nach dem Code, someWeakReference.Target ausgewertet, würde der GC feststellen, dass es eine starke Referenz auf das Objekt existiert und seine Sammlung nicht aus. Auf der anderen Seite, sagt:

 
    if (!someWeakReference.IsAlive) 
    cleanup_related_object(); 

gäbe es kein Risiko für sein Versehen einer Verlängerung der Lebensdauer des Ziels von someWeakReference Ziel

Verwandte Themen