垃圾收集器将在程序出口的后台运行以运行挂起的终结器,但如果终结器耗时太长,它将过早地放弃并退出.
您可以使用以下程序演示:
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次调用.
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |