1

我有一个带有 WeakReferences 对象的集合。对象在运行时动态加载,可以被 GC 随机回收。

有时,我需要永久删除一个对象,这是通过异步 DB 命令完成的。含义 - 在删除命令和实际提交持久性数据库中的删除之间有一个时间段,可以对对象进行 GC,然后从数据库中重新加载。

我解决这个问题的最简单方法是在每个对象中都有一个“已删除”标志(已经有一个),并且在执行删除操作时,将对已删除对象的强引用添加到 DB Command 对象,所以当操作完成后强引用丢失,对象可以被永久释放。

问题是,GC 是否允许通过预读来收集我的对象?它适用于这种情况吗?我是否保证在 DB 命令出列并处理之前不会收集该对象?

以下是一些较低级别的详细信息:

Dictionary<Int64, WeakReference> mItems;
struct IOCommand
{
    public CommandDetails command;
    public object[] strongReferences;
}
Queue<IOCommand> mIOQueue;
void queueCommand(CommandDetails command, object relatedObject)
{...}

您可以看到,在对命令进行排队时,我将相关对象作为强引用传递给队列,直到它被处理为止,但是由于未使用该对象,问题是它们是否可以被优化掉......

阿米特。

4

2 回答 2

3

只要您的代码对对象有(非弱)引用,它就不会被收集。

因此,您应该是安全的,(未来)Db 命令将使用该引用这一事实确保它仍然存在。

只要确保在这种情况下不依赖弱引用,强引用应该有适当的生命周期。


但由于没有使用该对象,问题是它们可以被优化掉......

不,只要命令存储在队列中,存储它们的方式将确保它们存在,当然只要队列是可访问的。

但请注意,如果它们真的不被使用,它甚至应该无关紧要......

于 2012-05-06T15:42:14.000 回答
1

GC 不应该删除任何引用它的东西。WeakReference 是您特别选择让它收集您引用的内容的例外情况。如果 DB Command 引用了要删除的对象,那就没问题了。

于 2012-05-06T15:43:05.800 回答