gpt4 book ai didi

C# "shared pointer"用于替代内存管理?

转载 作者:行者123 更新时间:2023-11-30 15:09:04 24 4
gpt4 key购买 nike

我正在寻找一种在 C# 中执行此操作的方法:

  1. Asker 对象会向 Giver 对象请求 Resource 对象。
  2. 当被询问时,Giver 将在其字典中搜索现有的匹配资源。如果找到,它将返回资源的引用;否则,它将从数据库数据创建一个新资源,将该引用保存在字典中,最后返回该引用。
  3. Asker 可能会多次请求相同的资源,在这种情况下,Giver 将从字典中返回相同的资源相同的次数。
  4. Asker 可能在任何时候对给定资源没有用处,在这种情况下,它不会对该资源做任何进一步的操作。

  5. 问题:Giver 如何检测任何不再使用的资源并将其从字典中删除?最好,Giver 应该在没有 Asker 帮助的情况下完成这项工作。

这可能吗?我似乎无法解决这个问题。

编辑:感谢大家的精彩回复。特别是弱引用。我不知道他们在那里。但我有 2 个主要目标,我可以更清楚地说明这些目标。

  1. 给予者不应依赖提问者来获得通知。
  2. 在使用给定资源时,所有 引用必须指向同一资源,以便对资源的修改反射(reflect)在使用同一资源的所有地方。

编辑:[删除了不正确的代码块]

最佳答案

你可以存储一个 WeakReference到字典中的资源而不是资源本身。这不会阻止资源被垃圾收集。

当您从字典中获取一个值(弱引用)时,您需要获取 Target并查看它是否为空。如果是,则该资源已被垃圾回收,您需要重新创建它。否则,您可以将目标作为缓存资源返回。

我认为对于 WeakReference 被认为有多“重要”没有太多控制 - 例如,我不认为你可以说它应该达到 gen2 .当然,您可以使用一些其他数据结构来确保任何资源至少被缓存(比如说)5 分钟,方法是保持对资源的强引用那么长时间。

如果您确实采用这种方法,您可能还需要定期检查字典并清除目标已被垃圾收集的条目,以避免字典中充满无用的条目。如果 key 集是固定的并且不是太大,那么这可能不值得,特别是考虑到您可能需要的同步。

关于C# "shared pointer"用于替代内存管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4864686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com