我正在寻找一种在 C# 中执行此操作的方法:
- Asker 对象将向 Giver 对象询问 Resource 对象。
- 当被询问时,给予者将在其词典中搜索现有的匹配资源。如果找到,它将返回资源的引用;否则,它将根据数据库数据创建一个新的资源,将该引用保存在字典中,最后返回该引用。
- 询问者可能多次请求相同的资源,在这种情况下,给予者将从字典中返回相同的资源相同次数。
询问者可能在任何时候对给定的资源没有任何用途,在这种情况下,它不会对该资源做任何进一步的事情。
问题:给予者如何检测不再使用的任何资源并将其从词典中删除?最好是给予者在没有询问者帮助的情况下完成此操作。
这可能吗?我似乎无法解决这个问题。
编辑:
感谢大家的精彩回复。特别是弱引用。我不知道他们在那里。但我有两个主要目标,我可以更清楚地指定它们。
- 给予者不应依赖询问者来获得通知。
- 当给定资源正在使用时,all引用必须指向相同的资源,以便对资源的修改反映在使用相同资源的所有位置。
编辑:
[删除了不正确的代码块]
你可以存储一个弱引用 http://msdn.microsoft.com/en-us/library/system.weakreference.aspx到字典中的资源而不是资源本身。这不会阻止资源被垃圾收集。
当您从字典中获取值(弱引用)时,您需要获取Target http://msdn.microsoft.com/en-us/library/system.weakreference.target.aspx并查看它是否为空。如果是,则该资源已被垃圾回收,您需要重新创建它。否则,您可以将目标作为缓存资源返回。
我不认为对一个事物的“重要性”有太多的控制WeakReference
被认为是 - 例如,我认为你不能说它应该达到第 2 代。当然你可以有一些other数据结构,以确保通过保持对资源的强引用那么长的时间,将任何资源缓存至少(例如)5 分钟。
如果您确实采用这种方法,您可能还需要定期检查字典并清除目标已被垃圾收集的条目,以避免您的字典充满无用的条目。如果密钥集是固定的并且不是太大,那么这可能不值得,特别是考虑到您可能需要的同步。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)