这里是一个代码执行意想不到的点可能会出现约GC一大篇:我怎样才能重现此.NET垃圾收集情况
终身,GC.KeepAlive,拉手回收 - 由cbrumme http://blogs.msdn.com/b/cbrumme/archive/2003/04/19/51365.aspx?wa=wsignin1.0
我的问题是如何在文章中提到的点再现强制GC?我尝试在OperateOnHandle()的开头放置GC.Collect(),并为类C定义了析构函数,但似乎不起作用。析构函数总是在程序结束时被调用。
@Jon,谢谢你建议我用尽调试器。现在我能够使用调试器优化的Release版本来重现文章中描述的问题。它证明了自从.NET v1以来,GC的行为不会改变。
码我用:
class C1
{
// Some unmanaged resource handle
IntPtr _handle = IntPtr.Zero;
static void OperateOnHandle(IntPtr h)
{
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("After GC.Collect() call");
// Use the IntPtr here. Oops, invalid operation
}
public void m()
{
OperateOnHandle(_handle);
}
~C1()
{
// Release and destroy IntPtr here
Console.WriteLine("In destructor");
}
}
class Program
{
static void Main(string[] args)
{
C1 aC = new C1();
aC.m();
}
}
输出:
在析构函数 GC.Collect的()调用之后
这是一篇旧文章(2003),所以很可能后一版本的.Net Framework会导致不同的行为。 – 2010-09-19 11:43:53
这篇文章真的是关于SafeHandle的。他还不能透露。 – 2010-09-19 12:16:22
@Hans,是的,你是对的。这完全关乎SafeHandler。 – Sheen 2010-09-19 22:45:11