C#没有提供跟踪所有可到达对象的直接机制,并且几乎没有理由想要这种自动跟踪功能(而不是,例如,您自己管理的显式池).
但要直接回答您的要求,您需要:
所有这些都必须以线程安全的方式完成.
public class Foo
{
private static readonly HashSet<WeakReference> _trackedFoos = new HashSet<WeakReference>();
private static readonly object _foosLocker = new object();
private readonly WeakReference _weakReferenceToThis;
public static void DoForAllFoos(Action<Foo> action)
{
if (action == null)
throw new ArgumentNullException("action");
lock (_foosLocker)
{
foreach (var foo in _trackedFoos.Select(w => w.Target).OfType<Foo>())
action(foo);
}
}
public Foo()
{
_weakReferenceToThis = new WeakReference(this);
lock (_foosLocker)
{
_trackedFoos.Add(_weakReferenceToThis);
}
}
~Foo()
{
lock (_foosLocker)
{
_trackedFoos.Remove(_weakReferenceToThis);
}
}
}
Run Code Online (Sandbox Code Playgroud)
你确定你需要所有这些吗?这一切都非常奇怪且非确定性(将在垃圾收集发生时受到严重影响).