我编写了一个托管类,它包装了一个非托管 C++ 对象,但我发现 - 当在 C# 中使用它时 - 当我在该对象上执行方法时,GC 会提前启动。我已经阅读了有关垃圾收集以及如何防止垃圾收集过早发生的内容。一种方法是使用“using”语句来控制对象何时被释放,但这将责任归于托管对象的客户端。我可以添加到托管类:
MyManagedObject::MyMethod()
{
<pre><code>System::Runtime::InteropServices::GCHandle handle =
System::Runtime::InteropServices::GCHandle::Alloc(this);
// access unmanaged member
handle.Free();
</code></pre>
<p>}</p>
这似乎有效。作为 .NET 的新手,其他人如何处理这个问题?
谢谢,
约翰
最佳答案
您可能想看看这篇文章:http://www.codeproject.com/Tips/246372/Premature-NET-garbage-collection-or-Dude-wheres-my 。我相信它准确地描述了您的情况。简而言之,补救措施要么是 using
block ,要么是 GC.KeepAlive
。然而,我同意,在许多情况下,您不希望将此负担传递给非托管对象的客户端;在这种情况下,在每个包装器方法末尾调用 GC.KeepAlive(this) 是一个很好的解决方案。
关于garbage-collection - 防止 CLR 中早期垃圾回收的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2725364/