然而,我刚刚遇到了类似的问题。有一个名为WorkItem(短寿命)的类,在构造函数中向另一个名为ClientEntityCache(长寿命)的类的事件注册。这些事件从未被取消注册,我可以在.NET分析器中看到WorkItem实例因为这些事件而被保持活动状态,而它们本不应该保持活动状态。因此,我决定让WorkItem实现IDisposable接口,并在Dispose()函数中以以下方式取消注册事件:
public void Dispose()
{
ClientEntityCache.EntityCacheCleared -= ClientEntityCache_CacheCleared;
// Same thing for 10 other events
}
编辑
这是我用于订阅的代码:
public WorkItem()
{
ClientEntityCache.EntityCacheCleared += ClientEntityCache_CacheCleared;
// Same thing for 10 other events
}
我还改变了取消注册的代码,不再调用新的EntityCacheClearedEventHandler。
编辑结束
我在使用WorkItem的代码中,在合适的位置做了Dispose的调用,并且在调试时可以看到函数确实被调用了,并且我对每个事件都进行了减法处理。但是仍然存在内存泄漏,我的WorkItems在被Dispose之后仍然保持活动状态,在.NET分析器中可以看到实例仍然存在,因为事件处理程序(如EntityCacheClearedEventHandler)仍然有它们在调用列表中。我尝试多次解除绑定它们(多个-=),以确保它们没有被绑定多次,但这并没有帮助。
任何人有任何想法为什么会发生这种情况或者我该如何解决这个问题吗? 我想我可以改变事件处理程序使用弱委托,但这需要大量修改遗留代码。
谢谢!
编辑:
如果有帮助的话,这里是.NET分析器描述的根路径: 很多东西都指向ClientEntityCache,这个指向EntityCacheClearedEventHandler,这个指向Object [],这个指向另一个实例的EntityCacheClearedEventHandler(我不知道为什么),这个指向WorkItem。