有没有办法检查垃圾收集器的实例引用?

时间:2017-01-18 20:42:22

标签: c# garbage-collection

我有一个没有正确处理的ViewModel类。即使调用了Dispose,也永远不会释放内存。我想我正在删除所有的引用和EventListeners,所以没有对这个对象的引用 - 但显然我没有全部去,因为临时析构函数中的断点没有被击中(或只是看内存使用情况)。

如果有任何现有的引用或获取有关它们的任何信息,我有什么办法可以检查垃圾收集器吗?该课程非常复杂,并且链接了许多不同的模型,服务等,因此手动尝试猜测/浏览所有代码将需要做很多工作。

有点混乱。这是我如何使用IDisposable的一个非常简单的例子:

public class ShortLifecyceViewModel : IDisposable
{
    private LongLifecycleService serviceWithEvent;

    public ShortLifecyceViewModel(LongLifecycleService serviceWithEvent)
    {
        serviceWithEvent.EventTriggered += ServiceWithEvent_EventTriggered;
    }

    private void ServiceWithEvent_EventTriggered(object sender, EventArgs e)
    {
        //perform action
    }

    public void Dispose()
    {
        //if this is not called, there is a memory leak. The LongLifecyleService retains a reference to ShortLifecyceViewModel
        //for its "long" life. If this is called, that reference is broken and ShortLifecyceViewModel can be GCed.
        serviceWithEvent.EventTriggered -= ServiceWithEvent_EventTriggered;
    }
}

编辑:更好的解决方案可能是实施弱事件处理程序。

0 个答案:

没有答案