我想检查一种终结器方法是否使终结器线程永远挂起:终结器线程是否处于阻塞状态(如死锁)。
如果不同的CLR之间存在差异,我将重点关注Windows(例如)高于4.5版的标准.NET框架。
我写了下面的代码测试虚拟对象是否完成。我认为:
虚拟对象:
/// <summary>
/// Little class to test if the finalizer thread is alive.
/// Just runs an action when finalized
/// </summary>
private class DummyObject
{
/// <summary>
/// Action to run when finalized
/// </summary>
private Action Finalized;
/// <summary>
/// Constructor
/// </summary>
public DummyObject(Action finalized)
{
Finalized = finalized;
}
/// <summary>
/// Finalizer
/// </summary>
~DummyObject()
{
Finalized();
}
}
主要代码:
bool finalized = false;
var obj = new DummyObject(() => finalized = true);
obj = null;
GC.Collect();
Thread.Sleep(1000);
Console.Write("Finalizer thread is alive: " + finalized);
确切的问题是: 如果此代码显示为true,是否证明终结器线程未被阻止?
答案 0 :(得分:1)
如果您确实需要这种自我诊断,我宁愿不依赖于此类实现细节(尽管现在-非常正确)。我宁愿编写发出自检FinalizersStart
和FinalizersStop
ETW / LLTng事件的逻辑。您可以使用the help of the TraceEvent library轻松做到这一点。