【发布时间】:2012-01-16 11:36:28
【问题描述】:
我正试图找出一个真正的 C# WeakKeyedDictionary<,> 的细节......但我遇到了困难。
我意识到这是一项不平凡的任务,但似乎无法声明 WeakKeyedKeyValuePair<,>(其中 GC 仅在键可访问时遵循值引用)使得它看起来不可能。
我看到了两个主要问题:
-
到目前为止,我看到的每个实现都不会在收集键后修剪值。想一想 - 使用这样的字典的主要原因之一是防止这些值被保留(不仅仅是键!),因为它们无法访问,但在这里它们被强引用指向。
是的,从字典中添加/删除足够多,它们最终会被替换,但如果你不这样做呢?
-
如果没有假设的
WeakKeyedKeyValuePair<,>(或另一种告诉 GC 仅在键可访问时标记值的方法),任何引用它的键的值都不会被收集。这是存储任意值时的问题。
问题 1 可以通过一种相当不理想/骇人听闻的方式解决:使用 GC 通知等待完整的 GC 完成,然后继续在另一个线程中修剪字典。这个我还可以。
但问题 2 让我很困惑。我意识到这很容易被“所以不要那样做”所反驳,但这让我想知道 - 这个问题甚至有可能解决吗?
【问题讨论】:
标签: c# .net dictionary garbage-collection weak-references