我有一个WeakReferences的集合来对象。 该对象在运行时动态加载,可以由GC随机收集。
偶尔,我需要永久删除一个对象,这是通过异步DB命令完成的。 含义 - 在持久性数据库中删除命令和删除的实际提交之间有一段时间,在该数据库中对象可以被GC,然后从数据库重新加载。
我解决这个问题的最简单方法是在每个对象中都有一个'Deleted'标志(已经有一个),并且在执行删除操作时,将删除对象的强引用添加到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)
{...}
你可以看到,当排队命令时,我将一个相关对象作为强引用传递到队列中,直到它被处理,但由于没有使用该对象,问题是它们可以被优化掉......
阿米特。
答案 0 :(得分:3)
只要您的代码具有对象的(非弱)引用,就不会收集它。
所以你应该是安全的,(未来的)Db Command将使用该引用的事实确保它仍然存在。
在这种情况下,请确保您不依赖于WeakReference,强引用应具有适当的生命周期。
但由于没有使用该对象,问题是它们可以被优化掉......
没有。只要命令存储在队列中,并且只要队列可以到达,存储它们的方式将确保它们存在。
但请注意,如果他们真的没有使用它甚至不应该......
答案 1 :(得分:1)
GC不应该删除任何引用它的东西。 WeakReference是一个例外,你专门选择让它收集你引用的东西。如果DB命令有对要删除的对象的引用,那么你会没事的。