Wie man das Ziel einer schwachen Referenz auf sichere Weise erreicht

8

Betrachten Sie diesen Code:

%Vor%

Es ist möglich, dass GC.Collect nach der Überprüfung von weakRef.IsAlive und vor der Verwendung von weakRef.Target ausgeführt wird.

Verstehe ich damit falsch? Wenn es möglich ist, gibt es einen sicheren Weg, das zu tun?

Zum Beispiel wäre eine API wie weakRef.GetTargetIfIsAlive() geeignet.

    
mehrandvd 13.02.2013, 15:15
quelle

3 Antworten

12

Diese API existiert bereits; weakRef.Target gibt null zurück, wenn das Objekt bereits als Garbage Collection erfasst wurde.

%Vor%     
Michael Liu 13.02.2013, 15:17
quelle
9

Die IsAlive -Eigenschaft existiert nicht zugunsten von Code, der das Ziel verwenden möchte, wenn es lebt, sondern eher für den Code, der herausfinden will, ob das Ziel gestorben ist, aber nicht Interesse daran, auf jeden Fall darauf zuzugreifen. Wenn Code Target gegen null testet, würde Target vorübergehend eine stark verwurzelte Referenz haben (der Code, der gegen null testet), und es ist möglich, dass das Erzeugen einer solchen verwurzelten Referenz das Objekt davon abhält Müll gesammelt werden, wenn es anders wäre. Wenn der Code nicht an Target interessiert ist, außer um herauszufinden, ob er noch ungültig ist, gibt es keinen Grund dafür, dass Code die Referenz erhält. Es kann stattdessen einfach IsAlive testen und geeignete Maßnahmen ergreifen, wenn es false zurückgibt.

    
supercat 27.02.2013 22:55
quelle
1

Nimm eine lokale Kopie des Ziels und überprüfe auf Null.

WeakReference.Target gibt null zurück, wenn das Ziel gesammelt wurde, aber es geht darum, dass es zwischen deinem .IsAlive check und dem Ziel gesammelt wird.

%Vor%

Console.WriteLine((weakRef.Target as StringBuilder).ToString()); wird eine NULL-Referenzausnahme auslösen, wenn die Umwandlung fehlschlägt.

    
Trevor Pilley 13.02.2013 15:19
quelle