根据this answer一个相当可靠的来源,在C#中,一旦GC可以证明它将不再被使用,即使对它的引用仍然存在,也可以收集一个对象。这可能导致令人惊讶的早期最终确定问题。
如果您特意想要将对象的收集延迟到某一点,那么最好的方法是什么?我们不能通过简单地保持对对象的引用来做到这一点,如果我们尝试简单地使用引用来停止GC,那么这些操作可能会被优化掉。我们能做什么?
(这个问题的动机是Java中的an older question,其中有人想要确保在WeakReferences被他们的指示对象排序时不会收集WeakReferences列表的所指对象。因此,一个解释在这种情况下,Java的行为与C#的行为类似或不同,并且也可以理解Java中相应问题的解决方案。)
答案 0 :(得分:1)
您可以考虑GCHandle.Alloc
来阻止收集管理对象:
http://msdn.microsoft.com/en-us/library/a95009h1%28v=vs.110%29.aspx
当不再需要Free
时,不要忘记致电GCHandle
。
object obj = ....;
GCHandle handle = GCHandle.Alloc(obj);
// ....
// object o is protected from garbage collection
// ....
handle.Free();
调用者必须确保对于给定的句柄,仅调用Free 一次。