Одна из проблем, с просто держа словарь объектов WeakReference является то, что нет никакого способа, коротких перечисления всего словаря, удалять из словаря любых объектов WeakReference которых цели выходят за рамки.
Было бы полезно, если бы WeakReference мог включать в себя делегат, который будет вызываться, когда основная цель вышла за рамки. Насколько я знаю, нет никакого способа сделать это. Если вы не возражаете добавить другое поле и небольшой код для объектов, которые вы храните в своем «слабом словаре», я бы предложил создать то, что я называю объектом «Finasposer», единственным полем которого является MethodInvoker; при размещении метод MethodInvoker должен быть исключен; финализатор должен Interlocked.Exchange() MethodInvoker для null и - если его старое значение было не нулевым - вызовите его. Объект, который должен быть записан в словаре, должен создать новый объект Finasposer с делегатом, который приведет к удалению ключа из словаря, когда это удобно.
Обратите внимание, что ни финализатор, ни какой-либо делегированный им вызов никогда не должны напрямую манипулировать словарем и не делать ничего, что потребовало бы приобретения блокировки. Если Finasposer содержит делегат, этот делегат гарантированно будет действительным, когда Finalize будет выполняться, но объект, прикрепленный к делегату, и любые объекты, на которые ссылается, могут быть в неожиданных состояниях. Однако должно быть безопасно, чтобы метод, называемый Finasposer, добавлял в связанный список ссылку на объект, который вышел из области видимости. Словарь «Добавить», «Удалить» и другие методы могут опросить связанный список, чтобы увидеть, умерла ли какая-либо из WeakReferences в нем, и ее необходимо очистить.
http://blogs.msdn.com/b/nicholg/archive/2006/06/04/617466.aspx – Mark
Хотя это не 'IDictionary', [ConditionalWeakTable] (http://msdn.microsoft. com/en-us/library/dd287757.aspx) - это то, что я действительно искал, когда Google привел меня сюда. Благодаря [этому ответу] (http://stackoverflow.com/questions/5764556/best-time-to-cull-weakreferences-in-a-collection-in-net/5764855#5764855). –
Удивительное открытие! –