什么时候c#中的垃圾收集器退出

des*_*nth 1 c#

在整个Main方法执行完毕后垃圾收集器是否关闭,或者它是否仍然在后台运行以清除Main方法在内存中留下的所有对象.

Mat*_*son 5

垃圾收集器将在程序出口的后台运行以运行挂起的终结器,但如果终结器耗时太长,它将过早地放弃并退出.

您可以使用以下程序演示:

using System;
using System.Diagnostics;
using System.Threading;

namespace Demo
{
    class Test
    {
        ~Test()
        {
            Thread.Sleep(250);
            Trace.WriteLine("In Test finalizer");
        }
    }

    class Program
    {
        static void Main()
        {
            var t = new Test[20];

            for (int i = 0; i < 20; ++i)
                t[i] = new Test();

            //t = null;
            //GC.Collect();
            //GC.WaitForPendingFinalizers();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在调试器下运行该程序,您将看到在GC放弃之前,实际只运行了20个终结器中的一些.

但是,您可以通过调用确保所有挂起的终结器在程序结束时完全运行

GC.Collect();
GC.WaitForPendingFinalizers()
Run Code Online (Sandbox Code Playgroud)

如果取消注释Main()上面示例代码末尾的三个注释掉的行并再次在调试器下运行程序,您将看到将对Test终结器进行所有20次调用.