C#:动态检查终结器线程是否被阻塞
C#: dynamically check if the finalizer thread is blocked
我想检查是否有一种终结器方法导致终结器线程永远挂起:终结器线程是否处于阻塞状态(如死锁)。
如果不同的 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);
确切的问题是:
如果此代码显示为真,是否证明终结器线程未被阻塞?
如果你真的、真的需要这样的自我诊断,我宁愿不依赖这样的实现细节(尽管现在 - 非常正确)。我宁愿编写自检 FinalizersStart
和 FinalizersStop
ETW/LLTng 事件的逻辑。您可以使用 the help of the TraceEvent library.
轻松完成
我想检查是否有一种终结器方法导致终结器线程永远挂起:终结器线程是否处于阻塞状态(如死锁)。
如果不同的 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);
确切的问题是: 如果此代码显示为真,是否证明终结器线程未被阻塞?
如果你真的、真的需要这样的自我诊断,我宁愿不依赖这样的实现细节(尽管现在 - 非常正确)。我宁愿编写自检 FinalizersStart
和 FinalizersStop
ETW/LLTng 事件的逻辑。您可以使用 the help of the TraceEvent library.