Ein Problem mit einfach ein Wörterbuch der WeakReference Objekte hält, ist, dass es keine Möglichkeit gibt, kurz das gesamte Wörterbuch aufzählt, von aus dem Wörterbuch zu entfernen alle WeakReference Objekte, deren Ziele gehen aus dem Rahmen.
Es wäre hilfreich, wenn ein WeakReference einen Delegierten enthalten könnte, die aufgerufen werden würde, wenn das primäre Ziel außerhalb des Bereichs ging. Soweit ich weiß, gibt es keine Möglichkeit, das zu tun. Wenn es Ihnen nichts ausmacht, den Objekten, die Sie in Ihrem "schwachen Wörterbuch" speichern, ein weiteres Feld und ein wenig Code hinzuzufügen, würde ich vorschlagen, ein "Finasposer" -Objekt zu erstellen, dessen einziges Feld ein MethodInvoker ist; Wenn sie entsorgt werden, sollte der MethodInvoker beendet werden; Der Finalizer sollte Interlocked.Exchange() den MethodInvoker auf null setzen und - wenn sein alter Wert nicht null ist - ihn aufrufen. Das Objekt, das in das Wörterbuch geschrieben werden soll, sollte ein neues Finasposer-Objekt mit einem Delegaten erstellen, der dazu führt, dass der Schlüssel aus dem Wörterbuch entfernt wird, wenn dies praktisch ist.
Beachten Sie, dass das weder der Finalizerthread noch ein aufgerufen Delegierten dadurch sollte nie direkt das Wörterbuch manipulieren, noch irgendetwas tun, der eine Sperre zu erwerben erfordern würde. Wenn der Finasposer einen Delegaten hält, ist dieser Delegat selbst gültig, wenn Finalize ausgeführt wird, aber das Objekt, das dem Delegaten zugeordnet ist, und alle Objekte, auf die es verweist, befinden sich möglicherweise in unerwarteten Status. Es sollte jedoch für die von Finasposer aufgerufene Methode sicher sein, zu einer verknüpften Liste einen Verweis auf das Objekt hinzuzufügen, das den Gültigkeitsbereich verlassen hat. Die Add-, Remove- und andere Methoden des Lexikons könnten die verknüpfte Liste abfragen, um zu sehen, ob irgendwelche der WeakReferences darin gestorben waren und entfernt werden mußten.
http://blogs.msdn.com/b/nicholg/archive/2006/06/04/617466.aspx – Mark
Obwohl es kein 'IDictionary 'ist, ist die [ConditionalWeakTable] (http://msdn.microsoft.wiktionary.org com/de-us/library/dd287757.aspx) habe ich wirklich gesucht, als Google mich hierher brachte. Danke an [diese Antwort] (http://stackoverflow.com/questions/5764556/best-time-to-cull-weakreferences-in-a-collection-in-net/5764855#5764855). –
Tolle Entdeckung! –