终结器是如何工作的
本文关键字:工作 何工作 | 更新日期: 2023-09-27 18:08:07
我想弄清楚c#中的GC/终结器是如何工作的,所以我写了下面的程序。但在ReadKey之后终结器被调用36193次。我认为它应该只在程序结束和AppDomain卸载时调用一次。我遗漏了什么,这是怎么运作的?
private class GCAnalyzer
{
private static int count = 0;
~GCAnalyzer()
{
if (!AppDomain.CurrentDomain.IsFinalizingForUnload())
{
count++;
GC.ReRegisterForFinalize(this);
Console.WriteLine("GC " + count);
}
}
}
static void Main(string[] a)
{
new GCAnalyzer();
Console.ReadKey();
}
如果我读对了,那么你正在调用~GCAnalyzer()当对象是"unlinked",并在该代码期间,你说它还没有准备好通过gc . reeregisterforfinalize (this)被"unlinked",这意味着在下次检查它仍然没有使用,它的结束代码运行…重新注册自己…等等
关键是添加!环境。HasShutdownStarted检查。然后在每个集合上调用终结器并将其放回终结列表中。在这个程序中终结器被调用了3次。每个GC两次。当应用程序第三次关闭时,它没有重新注册,所以它可以优雅地关闭。
private class GCAnalyzer
{
private static int count = 0;
~GCAnalyzer()
{
Console.WriteLine("GC " + count);
if (!AppDomain.CurrentDomain.IsFinalizingForUnload() &&!Environment.HasShutdownStarted)
{
count++;
GC.ReRegisterForFinalize(this);
}
}
}
static void Main(string[] a)
{
new GCAnalyzer();
Console.ReadKey();
GC.Collect();
Console.ReadKey();
GC.Collect();
}