Я хочу проверить, не вызвал ли один метод финализатора вечность потока финализатора навсегда: находится ли поток финализатора в заблокированном состоянии (например, в тупике) или нет.
Если есть различия в разных CLR, яЯ сфокусирован на стандартной платформе .NET для Windows в версиях выше (скажем) 4.5.
Я написал следующее тестирование кода, если фиктивный объект будет завершен.Я предполагаю:
- есть только один поток финализатора (это правильно?)
- все финализаторы работают в потоке финализатора (это правильно?)
Пустой объект:
/// <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, это доказывает, что поток финализатора не заблокирован?