处置具有长期生存依赖性的对象

时间:2010-03-24 09:36:35

标签: c# .net events dispose

public class ABC
{
    public ABC(IEventableInstance dependency)
    {
        dependency.ANewEvent += MyEventHandler;
    }

    private void MyEventHandler(object sender, EventArgs e)
    {
        //Do Stuff
    }
}

让我们说ABC的一个实例是一个长生命对象,我的依赖是一个更长的运行对象。当需要清理ABC的实例时,我有两个选择。

我可以使用Cleanup()方法取消订阅ANewEvent事件,或者我可以实现IDisposable并在Dispose中取消连接事件。现在我无法控制消费者是否会调用dispose方法,甚至无法调用Cleanup方法。

我应该实施终结者并取消订阅吗?感觉很脏,但我不想挂ABC的实例。

思想?

2 个答案:

答案 0 :(得分:1)

我在MSDN上看到了这个:

  

因为Dispose方法必须是   明确调用,对象   实现IDisposable 也必须   实现终结器来处理   当Dispose不是时释放资源   称为即可。默认情况下,垃圾   收集器自动调用   在回收之前对象的终结器   它的记忆。但是,一旦处理完毕   方法已被调用,它是   通常不需要垃圾   收集者打电话给处置   对象的终结者。阻止   自动完成,处理   实现可以调用   GC.SuppressFinalize方法。

因此,在这种情况下,为了安全起见,我将实现IDisposable和终结器。我同意,它有点脏,但话又说回来,那就是你在处理长寿命物品时付出的代价。

答案 1 :(得分:1)

在将这个问题单独留下一年之后,明显的解决办法就是我应该实现IDisposable并简单地取消订阅我的Dispose()中的事件。

由于我不负责依赖的生命周期,因此我不应该对它做任何事情。