2009-11-06 17 views
15

Podczas używania WeakReference, jak możemy być pewni, że cel nie jest zbierany między wywołaniami .IsAlive i .Target?Bezpieczeństwo wątków WeakReference

Na przykład:

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

Odpowiedz

25

prostu się Target i sprawdzić, czy to nie jest zerowy:

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

docs for IsAlive konkretnie powiedzieć:

Ponieważ obiekt potencjalnie mogłyby być odzyskany do zbiórki śmieci zaraz po tym, jak właściwość IsAlive zwraca wartość true, użycie tej właściwości nie jest zalecane, chyba że testujesz tylko dla fałszywej wartości zwracanej.

2

Nie możesz. Przypisz myWeakReference.Target do zmiennej i sprawdź, czy jest pusta.

4

Jedynym celem nieruchomości "IsAlive" jest sytuacja, w której chcesz podjąć pewne działanie, jeśli cel osłabionej referencji został już zniszczony, ale w którym nie chcesz ryzykować przypadkowego utrzymania go przy życiu dłużej niż to konieczne . Jeśli ktoś powie, np.

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

i śmieci kolektor miał (z jakiegokolwiek powodu) spust tuż po kodzie, który oceniał someWeakReference.Target, GC nie zauważy, że istnieje wyraźne odniesienie do tego obiektu i wyklucza jego kolekcję. Z drugiej strony, mówiąc:

 
    if (!someWeakReference.IsAlive) 
    cleanup_related_object(); 

nie byłoby ryzyko przypadkowego przedłużając żywotność cel someWeakReference kierować

Powiązane problemy