垃圾收集器是在整个Main方法执行结束后关闭,还是仍在后台运行以清理Main方法在内存中留下的所有对象。
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();
}
}
}
在调试器下运行该程序,您会发现在GC放弃之前只有其中一部分的20个终止器被实际执行。
然而,您可以通过调用以下命令来确保在程序末尾完全运行所有待处理的终止器:
GC.Collect();
GC.WaitForPendingFinalizers()
Main()
结尾处的三行注释并再次在调试器下运行程序,您将会看到对Test
终结器的20个调用。一旦进程终止,属于它的所有资源都会被释放。这是由操作系统执行的。GC 用于托管资源。
我猜测在控制台应用程序中,main 是入口方法。
Main
返回,它也可以正常进行。 - Dmitry Bychenko