c#中的垃圾收集器何时退出

c#中的垃圾收集器何时退出,c#,C#,垃圾收集器是在整个主方法完成执行后关闭,还是仍在后台运行以清理主方法在内存中留下的所有对象。一旦进程终止,属于它的所有资源都将被释放。这是由操作系统执行的。GC用于托管资源 我猜在这种情况下,main是入口点方法,例如在控制台应用程序中。垃圾收集器(GC)将随应用程序启动并退出。 在应用生命周期内,它在后台运行以释放托管资源 GC是由.net framework本身产生的。垃圾收集器将在程序退出时在后台运行,以运行挂起的终结器,但如果终结器花费的时间太长,它将放弃并过早退出 您可以使用以下程序演

垃圾收集器是在整个主方法完成执行后关闭,还是仍在后台运行以清理主方法在内存中留下的所有对象。

一旦进程终止,属于它的所有资源都将被释放。这是由操作系统执行的。GC用于托管资源

我猜在这种情况下,main是入口点方法,例如在控制台应用程序中。

垃圾收集器(GC)将随应用程序启动并退出。 在应用生命周期内,它在后台运行以释放托管资源


GC是由.net framework本身产生的。

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

您可以使用以下程序演示这一点:

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();
        }
    }
}

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

finalizer仍然需要在Main退出后运行,因此,在所有用户代码完成执行后不久,GC/框架就会终止。有一个技术性的、正确的答案是很有意思的。应用程序通常在主方法(以及程序的入口点)完成时终止。此时,GC可能会运行一段时间,但最终,操作系统将清除所有分配的内存。垃圾收集器在单独的线程中运行,因此即使返回
Main
,垃圾收集器也可以继续运行。关于C#可执行文件的Main方法,Main几乎总是入口点,即使你有表格。
GC.Collect();
GC.WaitForPendingFinalizers()