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.
Diese API existiert bereits; weakRef.Target
gibt null
zurück, wenn das Objekt bereits als Garbage Collection erfasst wurde.
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.
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.
Console.WriteLine((weakRef.Target as StringBuilder).ToString());
wird eine NULL-Referenzausnahme auslösen, wenn die Umwandlung fehlschlägt.
Tags und Links .net c# garbage-collection weak-references