C#: динамически проверить, заблокирован ли поток финализатора
Я хочу проверить, не вызвал ли один метод финализатора поток финализатора навсегда: находится ли поток финализатора в заблокированном состоянии (например, в тупике) или нет.
Если есть различия в разных 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, это доказывает, что поток финализатора не заблокирован?
1 ответ
Если вам действительно очень нужна такая самодиагностика, я бы не стал полагаться на такие детали реализации (хотя сейчас - вполне корректно). Я бы лучше написал логику самоконтроля FinalizersStart
а также FinalizersStop
События ETW/LLTng издаются. Вы можете сделать это легко с помощью библиотеки TraceEvent.