终结器是如何工作的

本文关键字:工作 何工作 | 更新日期: 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();
    }