获取对象处理/销毁的通知

时间:2010-07-16 18:30:06

标签: c# .net clr object-lifetime

我需要一种方法来跟踪各种类的实例,而不需要那些知道它们被跟踪的类。基本上,我有一个类工厂,它创建实例并将它们交给另一个线程。一旦该线程完成并卸载实例,我需要得到通知,这样我就可以引用计数并在所有实例都消失后从我的类工厂退出。

挑战在于我无法修改我将加载的任何类,因为我无法控制它们的源代码。

跟踪我创建的实例很简单,我可以在创建它们时将它们放入某种集合中。跟踪他们的破坏导致我的问题。如果我可以修改源代码,我会向每个类添加一个事件,当我创建一个实例时,我会挂钩事件并将其用作我的通知。但我不能这样做。

所以,问题是:是否有一种偷偷摸摸的方式来监控对象实例并检测它何时被销毁?

4 个答案:

答案 0 :(得分:11)

由于您正在创建对象,因此您似乎可以返回Decorator而不是实际的实例。

通过使用Decorator Pattern,您可以将返回的对象“包装”在您自己的装饰API中。装饰可以提供IDisposable实现,提供您的销毁通知。

答案 1 :(得分:5)

无法获得有效通知,但您可以对对象保留WeakReference并定期检查是否有人死亡。

编辑:我比Reed更喜欢Reed的答案!

答案 2 :(得分:2)

如果您拥有对您创建的实例的引用列表,那么它们将不会被垃圾收集,因此永远不会被销毁......

相反,您可以创建一个存储库,其中包含Guids列表并为每个实例创建一个新的Guid,然后将其添加到列表中 - 类似于FactoryRepository。通过这种方式,您没有垃圾收集的引用问题,因为Guids是结构而不是引用类型。然后,您可以从每个类继承以创建可以在destroy上通知的类型。我假设你不能改变原始类的代码,你也不能改变这些类的消费者,因此装饰模式(通过接口)之类的东西已经输出,因为类型不兼容。

非常简化的例子:

public class OriginalClassDestroyNotifier : OriginalClass
{
    private readonly Guid _instanceId;

    public OriginalClassDestroyNotifier(Guid instanceId)
    {
        _instanceId = instanceId;
    }

    ~OriginalClassDestroyNotifier()
    {
        FactoryRepository.NotifyDestroyed(_instanceId);
    }
}

答案 3 :(得分:1)

你如何控制对象的破坏:

public void Destroy(T obj)
{
    if (obj == null)
        throw new ArgumentNullException("obj");
    if (!_living.Contains(obj))
        throw new ArgumentException("Where did this obj come from?");

    using (obj as IDisposable)
    {

    }

    _living.Remove(obj); // List?
}